`

页面下载链接的实现

阅读更多

需求:

在页面放置按钮或链接,客户点击即可下载文件

方法:

实现客户点击下载有两种方式:1,直接提供链接,该链接指到服务器对应的文件,浏览器打不开就会自动下载;2.点击提交请求至服务器,服务器响应数据流,浏览器下载。

实现:

本应用环境--spring mvc +mybatis,数据层涉及不提,主要记录业务层的实现,controller处理

 

@Controller("downloadController")
@RequestMapping(value = "/web")
public class DownloadController {
	
	@Autowired
	CommonsMultipartResolver resolver;
	@Autowired
	ClientProgramService cservice;
	/**
	 * 跳转到下载页面
	 * @return
	 */
	@RequestMapping(value = "/download")
	public ModelAndView donwload() {
		ModelAndView mav = new ModelAndView("download");
		return mav;
	}
	
	/**
	 * 下载程序
	 * @param id
	 * @param response
	 * @return
	 * @throws IOException
	 */
	@RequestMapping(value="/download/program/{id}")
	public ModelAndView downloadProgram(@PathVariable long id,HttpServletResponse response,HttpServletRequest request) throws IOException{
		ClientProgram program=cservice.get(id);
		String path=program.getPath();
		path=java.net.URLEncoder.encode(path, "utf-8");
		response.sendRedirect("http://www.xxx.com/"+path);
		return null;
	}
	
	/**
	 * 下载文档
	 * @param type
	 * @param response
	 * @param request
	 * @return
	 * @throws IOException
	 */
	@RequestMapping(value="/download/document")
	public void download(HttpServletResponse response,HttpServletRequest request) throws IOException{
		String relativePath=request.getServletContext().getRealPath("/")+"upload/client/document/";
		File pfile=new File(relativePath);
		File[] files=pfile.listFiles();
		if(files!=null&&files.length>0){
			String fileName=files[0].getName();
			InputStream in=new FileInputStream(new File(relativePath+fileName));
			OutputStream out=response.getOutputStream();
			response.setContentType(request.getServletContext().getMimeType(relativePath+fileName));
			response.setHeader("Content-Disposition", "attachment; filename=babydancer-directions");
			IOUtils.copy(in, out);
			in.close();
			out.close();
		}else
		     response.getWriter().write("对不起,文件暂时未上传");
	}
}

 

 

 

程序下载使用第一种方式,将客户请求跳转到服务器中指定的文件;文档的下载使用第2种方式,以子节流的形式响应请求,这时就要求设置响应类型response.setContentType和响应头response.setHeader("Content-Disposition", "attachment; filename=..."),可以自己定义输出的文件名称。(注:文件的传输,严格的做法是开辟一个byteArray,以此为单位,每次传输一个arry大小,可以避免内存不足,这里只强调实现方法)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics