JSP实现文件下载

来源:互联网 发布:张天一 知乎 编辑:程序博客网 时间:2024/04/28 22:47

看起来是一个非常简单的功能,也许有人会说直接把文件路径贴到超链结里面就可以下载了呀,也或者有人会说用jspsmartupload组件,两三行代码就可以搞定了。是的。多曾经也这样认为 。但事实是这么表面化么?不是

最近两天因为项目里面有这个功能要求,以前碰到这种需求都是拷贝同事们的现成代码,你传给我,我传给你的。但真正实现方式研究得很少,或者说根本就没思考过怎么实现将文件从服务器上下载到浏览器上。这次我将以前的代码拷过来却发生了错误:一是文件下载不了,弹出下载框提示文件名乱码,文件类型未知,下载时会出现地址找不到的情况。二是根本出不来下载框,页面报错response.getOutPutStream()已经被调用。第一种错误是用FileInputStream时出现的。第二种错误是用jspsmartupload时出现的。而如果直接粘贴地址到超链结里面,页面会在被加载时将地址前面加ftp:////地址出错。另外,在JSP中得到当前绝对路径的方式是request.getSession().getServletContext().getRealPath("")

下面将正确下载的代码贴出来。供大家参考。

    String name = request.getParameter("name");

    name=Commonsub.toUtf8String(name);
   
 response.setContentType("application/octet-stream");
 response.setHeader("Location",name);
 response.setHeader("Cache-Control", "max-age=100");
     //filename应该是编码后的(utf-8)
 response.setHeader("Content-Disposition", "attachment; filename=" + name);
 File file=new File(request.getSession().getServletContext().getRealPath("")+"/output",Commonsub.ex_chinese(name));
 response.setContentLength((int)file.length());
 OutputStream outputStream = response.getOutputStream();
 InputStream inputStream = new FileInputStream(file);
 byte[] buffer = new byte[1024];
 int i = -1;
 while ((i = inputStream.read(buffer)) != -1) {
  outputStream.write(buffer, 0, i);
  }
 outputStream.flush();
 outputStream.close();
 inputStream.close();
 outputStream = null;