看起来是一个非常简单的功能,也许有人会说直接把文件路径贴到超链结里面就可以下载了呀,也或者有人会说用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;