Java Web端程序实现文件下载的方法分享(转)

原文链接:http://www.jb51.net/article/85101.htm

package com.rhui.util;
  
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
  
import javax.servlet.http.HttpServletResponse;
  
import org.apache.commons.lang3.StringUtils;
  
/**
  * 文件下载类
  */
public class DownloadUtils {
   /**
    * 文件下载编码
    * 该编码告诉浏览器文件名的编码方式,以防下载中文文件名时有乱码
    */
   private static String encoding = "utf-8" ;
    
   /**
    * 文件下载
    * @param response
    * @param filePath 文件在服务器上的路径,包含文件名
    */
   public static void download(HttpServletResponse response, String filePath){
     File file = new File(filePath.toString());
     download(response, file, null , encoding);
   }
    
   /**
    * 文件下载
    * @param response
    * @param filePath 文件在服务器上的路径,包括文件名称
    * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
    */
   public static void download(HttpServletResponse response, String filePath, String fileName){
     File file = new File(filePath.toString());
     download(response, file, fileName, encoding);
   }
    
   /**
    * 文件下载
    * @param response
    * @param filePath 文件在服务器上的路径,包括文件名称
    * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
    * @param encoding 文件名称编码
    */
   public static void download(HttpServletResponse response, String filePath, String fileName, String encoding){
     File file = new File(filePath.toString());
     download(response, file, fileName, encoding);
   }
    
   /**
    * 文件下载
    * @param response
    * @param file 文件
    * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
    */
   public static void download(HttpServletResponse response, File file) {
     download(response, file, null , encoding);
   }
    
   /**
    * 文件下载
    * @param response
    * @param file 文件
    * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
    */
   public static void download(HttpServletResponse response, File file, String fileName) {
     download(response, file, fileName, encoding);
   }
    
   /**
    * 文件下载
    * @param response
    * @param file 文件
    * @param fileName 文件下载到浏览器的名称,如果不想让浏览器下载的文件名称和服务器上的文件名称一样,请设置该参数
    * @param encoding 文件名称编码
    */
   public static void download(HttpServletResponse response, File file, String fileName, String encoding) {
     if (file == null || !file.exists() || file.isDirectory()){
       return ;
     }
      
     // 如果不指定文件下载到浏览器的名称,则使用文件的默认名称
     if (StringUtils.isBlank(fileName)) {
       fileName = file.getName();
     }
  
     try {
       InputStream is = new FileInputStream(file);
       download(response, is, fileName, encoding);
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
    
   /**
    * 文件下载
    * @param response
    * @param is 文件输入流
    * @param fileName 下载的文件名称
    * @throws IOException
    */
   public static void download(HttpServletResponse response, InputStream is, String fileName){
     download(response, is, fileName, encoding);
   }
    
   /**
    * 文件下载
    * @param response
    * @param is 文件输入流
    * @param fileName 下载的文件名称
    * @param encoding 编码格式
    */
   public static void download(HttpServletResponse response, InputStream is, String fileName, String encoding){
     if (is == null || StringUtils.isBlank(fileName)){
       return ;
     }
      
     BufferedInputStream bis = null ;
     OutputStream os = null ;
     BufferedOutputStream bos = null ;
      
     try {
       bis = new BufferedInputStream(is);
       os = response.getOutputStream();
       bos = new BufferedOutputStream(os);
       response.setContentType( "application/octet-stream;charset=" + encoding);
       response.setCharacterEncoding(encoding);
       response.setHeader( "Content-disposition" , "attachment;filename=" + URLEncoder.encode(fileName, encoding));
       byte [] buffer = new byte [ 1024 ];
       int len = bis.read(buffer);
       while (len != - 1 ){
         bos.write(buffer, 0 , len);
         len = bis.read(buffer);
       }
        
       bos.flush();
     } catch (IOException e){
       e.printStackTrace();
     } finally {
       if (bis != null ){
         try {
           bis.close();
         } catch (IOException e){}
       }
        
       if (is != null ){
         try {
           is.close();
         } catch (IOException e){}
       }
     }
   }
  
   public static String getEncoding() {
     return encoding;
   }
  
   public static void setEncoding(String encoding) {
     DownloadUtils.encoding = encoding;
   }
}

如果文件保存在服务器的非网站目录下

1
2
String filePath = "c:\\file.zip" ;
DownloadUtils.download(response, filePath);

如果文件是输入流

1
2
3
4
5
6
// is为文件输入流
// fileName为浏览器下载的文件名称
// encoding为文件名称编码,预防文件中有中文的时候产生乱码
String fileName = "file.zip" ;
String encoding = "utf-8" ;
DownloadUtils.download(response, is, fileName, encoding);

Servlet中文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.rhui.web.servlet;
  
import java.io.IOException;
  
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
import com.rhui.util.DownloadUtils;
  
@WebServlet ( "/download/servlet" )
public class DownloadServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
    
   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     String filePath = "c:\\file.zip" ;
     DownloadUtils.download(response, filePath);
   }
  
}

 

PS:图片下载(含防盗链功能)

 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package cn.itcast.day06.web.servlet;
  
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
  
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
public class DownloadServlet extends HttpServlet {
  
  public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  
  // 实现防盗链功能
  // 获得 referer 头 用于说明来访者来自哪里
  String referer = request.getHeader( "referer" );
  if (referer== null || !referer.startsWith( "http://localhost" )) {
   // 是盗链者
   response.sendRedirect( "/day06/index.jsp" );
   return ;
  }
  
  
  // 解决response中文乱码问题
  response.setContentType( "text/html;charset=utf-8" ); // 设置消息体的编码
  
  
  // 通过 http 协议 发送的http响应消息头 不能出现中文 中文必须要经过url编码
  String filename = URLEncoder.encode( "美女.jpg" , "utf-8" );
  
  // 通知浏览器以下载的方式读取资源
  response.setHeader( "content-disposition" , "attachment;filename=" +filename);
  
  // 读取图片数据 发给ie浏览器
  String webPath = "/download/美女.jpg" ; // 相当于当前web应用的path
  
  ServletContext servletContext = super .getServletContext();
  
  InputStream in = servletContext.getResourceAsStream(webPath);
  
  
  OutputStream out = response.getOutputStream();
  
  
  int len;
  byte [] buffer = new byte [ 1024 ];
  while ((len=in.read(buffer))!=- 1 )
   out.write(buffer, 0 , len);
  
  }
  
  public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  doGet(request, response);
  }
  
}

转载于:https://www.cnblogs.com/elroye/p/7881122.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值