servlet实现文件下载

[java]  view plain  copy
  1. 1.总的流程介绍</span>  

出于安全的考虑一般情况下,我们会将服务器的文件或者用户上传的文件放在WEB-INF目录的子目录下,所以不能直接通过<a href=""></a>的形式实现静态下载。所以,文件下载的一般流程是,连接设为servlet,然后在servlet中将文件输送到用户客户端。

比如在jsp界面设置如下

[html]  view plain  copy
  1. <c:forEach items="${sessionScope.beans }" var="bean" >  
  2.   
  3.     <a href="downLoadFileServlet?methodName=downloadfile&id=${bean.id }">${bean.id }</a></span>  

 
 然后在servlet 中实现文件的下载,而在servelt中实现下载需要实现如下几个步骤 
 

1)获取文件的信息,比如文件名,文件路径

2)设置response的ContextType

3)设置response的响应头headder

4)通过输入流传送文件,实现下载

2.response.setContextType()

       response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。其中的参数的,大家可以参考这个文章:http://rubyq.iteye.com/blog/1408141

如果不知道如何设置,可以采用如下方法获取ContextType

[java]  view plain  copy
  1. <span style="white-space:pre">    </span>String contentType = getServletContext().getMimeType(fileName);//获取contentType <  
[java]  view plain  copy
  1. <span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">     </span>if (contentType == null)//如果找不到,就设置为application/octet-stream</span>  
[java]  view plain  copy
  1. <span style="white-space: pre;">      </span>contentType = "application/octet-stream";  
[java]  view plain  copy
  1. response.setContentType(contentType);//设置contextType  
3.response.addheadder()

这个方法是为了告诉客户端是直接打开文件,还是下载,以及设置下载文件的名称。

当用于下载时,使用方式一般为:

[java]  view plain  copy
  1. <span style="white-space:pre">    </span>response.addHeader("Content-Disposition""attachment;filename=?");<span style="white-space:pre">    </span>  
值得注意的是,如果发现配置的文件名出现中文乱码的问题,有如下两种解决方法,

1)

[java]  view plain  copy
  1. <span style="white-space:pre">    </span>response.addHeader("Content-Disposition""attachment;filename="+<span style="font-family: Arial, Helvetica, sans-serif;">java.net.URLEncoder.encode(realName.substring(fileName, "UTF-8"));</span>  
 
 2) 
 
[java]  view plain  copy
  1. <span style="white-space:pre">    </span> response.setHeader( "Content-Disposition""attachment;filename=" + new String( fileName.getBytes("gb2312"), "UTF-8" ) );   

(以上方法来自于http://www.cnblogs.com/zhycyq/p/3363365.html)

4.实现下载代码

[java]  view plain  copy
  1. public void downloadfile(HttpServletRequest request,  
  2.             HttpServletResponse response) throws IOException {  
  3.         List<FileuploadBean> beans = (List<FileuploadBean>) request  
  4.                 .getSession().getAttribute("beans");  
  5.         String idString = request.getParameter("id");  
  6.         FileuploadBean downoadBean = new FileuploadBean();  
  7.         Integer id = Integer.parseInt(idString);  
  8.         for (FileuploadBean bean : beans) {  
  9.             if (bean.getId() == id) {  
  10.                 downoadBean = bean;  
  11.                 break;  
  12.             }  
  13.         }  
[java]  view plain  copy
  1. String realName = downoadBean.getFileName();  
  2. <pre name="code" class="java"><span style="white-space:pre">        </span>//以上是获取文件信息  
// 根据文件的类型设置response对象的ContentTypeString contentType = getServletContext().getMimeType(realName.substring(realName.lastIndexOf("\\")+1));if (contentType == null)contentType = "application/octet-stream";response.setContentType(contentType); //设置addheaderresponse.addHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(realName.substring(realName.lastIndexOf("\\")+1), "UTF-8"));

 
 
[java]  view plain  copy
  1. <span style="white-space:pre">        </span>//下载  
  2.         InputStream inputStream = null;  
  3.         OutputStream outputStream = null;  
  4.         try {  
  5.             inputStream = new FileInputStream(downoadBean.getFilePath());  
  6.             byte[] buffer = new byte[1024];  
  7.             int len = 0;  
  8.             outputStream = response.getOutputStream();  
  9.             while ((len = inputStream.read(buffer)) != -1)  
  10.                 outputStream.write(buffer, 0, len);  
  11.         } catch (Exception e) {  
  12.             e.printStackTrace();  
  13.         } finally {  
  14.             outputStream.close();  
  15.             inputStream.close();  
  16.         }  
  17.   
  18.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值