通过程序实现文件下载更名,动态文件下载
在做DIY项目的时候,要实现一个下载业务,由于服务器资源有限,所以需要隐藏下载文件地址,在下载的时候还要更改保存文件的名字,比如我保存到服务器的文件名是2008_7_8_xfire.rar ,数据可以中关于该文件还有一个文件描述,比如该文件的描述名字为XFIRE.
在页面,下载连接中该文件的真实地址要隐藏,并且要将2008_7_8_xfire.rar替换成XFIRE.rar,要实现这种操作,可以使用文件转发功能...
步骤如下:
1)调用HttpServletResponse的.setContentType方法设置Content-Type头字段的值为浏览器无法使用某种方式或激活某个程序来处理的MIME类型,例如:"application/octet-stream"或application/x-msdownload 等
2)通过HttpServletResponse的setHeader方法设置Content-Disposition头的值为“attachment;filename=文件名”
代码如下:
response.setContentType("application/x-download");
response.setHeader("Content-Disposition", "attachment; filename=\""+java.net.URLEncoder.encode("上网DIY.rar", "UTF-8")+"\"");
request.getRequestDispatcher("2008_7_8_diy.rar").forward(request,response);
代码中:filename属性使用了字符转换,这样可以解决下载文件中文名的问题..
上网DIY.rar是我要输出(下载)的文件名,2008_7_8_diy.rar是保存在服务器真实的文件名字.在这里就实现了文件的转发,并且更改文件的下载名字.但是要实现此业务的时候,我还想着通过程序读出文件,然后再输出到客户端来实现名字转换,现在想起来觉得好傻,服务器已经不堪负荷了...(一台服务器放了10几个网站...郁闷...而且此项目还提供大文件的上传...如果用程序输出,我怕系统隔几分钟就死一次了...)....
下面实现动态文件下载--动态文件指该文件实际并不存在,是内存中的数据,然后输出成具体文件:
内容应该当二进制来处理,所以应该调用HttpServletResponse的getOutputStream方法返回的ServletOutputStream对象来向客户端写入文件内容。
代码如下:
response.setContentType("application/x-msdownload");
response.addHeader("Content-Disposition", "attachment;filename=hello.txt");
ServletOutputStream sos=response.getOutputStream();
sos.write("hello kids".getBytes());
sos.close();
输出文件为hello.txt 内容为hello kids