需求:
在页面放置按钮或链接,客户点击即可下载文件
方法:
实现客户点击下载有两种方式: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大小,可以避免内存不足,这里只强调实现方法)