作者: yagesi  链接:http://yagesi.javaeye.com/blog/165005  发表时间: 2008年02月26日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

在做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

谢谢... QQ:4816800
本文的讨论也很精彩,浏览讨论>>


JavaEye推荐




文章来源:http://yagesi.javaeye.com/blog/165005
posted on 2008-07-05 12:20  Zen.赱L  阅读(214)  评论(0编辑  收藏  举报