欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-12 11:52:08
web文件下载有两种,一种是文件在网站目录下,在浏览器中直接输入文件路径即可下载,如http://www.xxx.com/file.zip。另外一种是文件不在网站目录下或者...

web文件下载有两种,一种是文件在网站目录下,在浏览器中直接输入文件路径即可下载,如http://www.xxx.com/file.zip。另外一种是文件不在网站目录下或者文件是动态生成的(导出报表或者导出excel等),这种情况需要通过response的outputstream实现文件的下载。downloadutils是一个java web文件下载工具类,提供多种静态方法实现文件下载。

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; 
  } 
} 

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

string filepath = "c:\\file.zip"; 
downloadutils.download(response, filepath); 

如果文件是输入流

// is为文件输入流 
// filename为浏览器下载的文件名称 
// encoding为文件名称编码,预防文件中有中文的时候产生乱码 
string filename = "file.zip"; 
string encoding = "utf-8"; 
downloadutils.download(response, is, filename, encoding); 

servlet中文件下载

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:图片下载(含防盗链功能)

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);
 }
 
}