FileDownload.java:文件下载工具类

2017-04-25·Mr.Xia

4489 次浏览

文件下载功能的工具类

JavaWeb工具类目录 [http://baike.xsoftlab.net/view/1059.html](http://baike.xsoftlab.net/view/1059.html)

基础版本:

```java

package com.zhenzhigu.commons.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 下载文件 创建人:Master.Xia 创建时间:2014年06月08日

*

* @version

*/

public class FileDownload {

/**

* @param request

* @param response

* @param fileAbsPath 文件绝对路径(包括文件名和扩展名)

* @param showName 下载后看到的文件名

* @return 文件名

*/

public static void execute(HttpServletRequest request,HttpServletResponse response, InputStream input,long length, String showName)throws Exception {

String info = request.getHeader("User-Agent").toLowerCase();

if (info.contains("firefox")) { // Firefox

showName = new String(showName.getBytes(), "ISO-8859-1");

} else { // IE,Chrome

showName = URLEncoder.encode(showName, "UTF-8");

}

response.reset(); // 响应重置

response.setHeader("Content-Disposition", "attachment; filename=\""+ showName + "\"");

response.addHeader("Content-Length", ""+length);

response.setContentType("application/octet-stream;charset=UTF-8");

OutputStream out = response.getOutputStream();

int len = 0;

byte[] buffer = new byte[1024*8];

while ((len = input.read(buffer)) != -1) {

out.write(buffer,0,len);

}

input.close();

response.flushBuffer();

}

public static void execute(HttpServletRequest request,

HttpServletResponse response, File file, String showName)

throws Exception {

execute(request, response, new FileInputStream(file), file.length(), showName);

}

public static void execute(HttpServletRequest request, HttpServletResponse response, String fileAbsPath, String showName) throws Exception{

execute(request, response, new File(fileAbsPath), showName);

}

}

```

支持断点续传的升级版本:

```java

package com.itshidu.commons.web.utils;

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.URLEncoder;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.Paths;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

* 下载文件

* @author Master.Xia

* @version 1.0 (2014.07.16)

* @version 1.1 (2018.02.16)

* @version 1.2 (2018.09.30)

*/

public class FileDownload {

/**

* 请求转发到一个指定的文件,就像浏览器直接访问这个文件一样,不会弹框提示

* @param request (请求)

* @param response (响应)

* @param file (访问的文件)

* @throws Exception (异常)

*/

public static void forward(HttpServletRequest request,HttpServletResponse response,File file)throws Exception {

forward(request, response, file, null, false);

}

/**

* 请求转发到一个指定的文件,就像浏览器直接访问这个文件一样,如果遇到浏览器不认识的文件类型,则会下载它,支持断点续传。

* 当isAttachment为true时会有下载提示框

* @param request (请求)

* @param response (响应)

* @param file (访问的文件)

* @param name (下载时在浏览器显示的名字)

* @param isAttachment (浏览器是否弹出下载框,true弹框,false不弹框)

* @throws Exception (异常)

*/

public static void forward(HttpServletRequest request,HttpServletResponse response,File file,String name,boolean isAttachment)throws Exception {

Path path = Paths.get(file.getAbsolutePath());

int length = (int)file.length();

int start = 0;

int end = length - 1;

String range = request.getHeader("Range");

if(range!=null&&range.length()>0) {

range = range.toLowerCase(); //RANGE:BYTES=100-500

range = range.replaceAll("\\s*", ""); //去除字符串中所有的不可见字符

if(range.contains("bytes=")) {//bytes=100

if(range.contains("-")) {

String a = range.substring(6, range.indexOf("-"));

start = Integer.parseInt(a);

if(range.charAt(range.length()-1)!='-') {

String b = range.substring(range.indexOf("-")+1);

end = Integer.parseInt(b);

}

}else {

String a = range.substring(6);

start = Integer.parseInt(a);

}

}

}

int contentLength = end - start + 1;

response.reset();

response.setHeader("Accept-Ranges", "bytes");

response.setContentType(Files.probeContentType(path));

response.setHeader("Content-Range",String.format("bytes %s-%s/%s", start, end, length));

response.setHeader("Content-Length", String.format("%s", contentLength));

response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);

if(isAttachment) {

//如果是下载,则弹框提示,解决乱码问题

String info = request.getHeader("User-Agent").toLowerCase();

String showName = file.getName();

if(name!=null&&name.length()>0)showName=name;

if (info.contains("firefox")) { // Firefox

showName = new String(showName.getBytes(), "ISO-8859-1");

} else { // IE,Chrome

showName = URLEncoder.encode(showName, "UTF-8");

}

response.setHeader("Content-Disposition", "attachment; filename=\""+ showName + "\"");

}

//数据传输

InputStream in = null;

try{

in = new FileInputStream(file);

int len,remain = contentLength;

byte[] buffer = new byte[1024*8];

OutputStream out = response.getOutputStream();

int plan = start;

while(plan>0){

plan -= in.skip(plan);

}

while((len=in.read(buffer))!=-1 && remain > 0) {

out.write(buffer, 0, (remain

}

}catch (Exception e) {

throw e;

}finally {

try {in.close(); } catch (Exception e2) { }

}

}

}

```

java downloadfile_FileDownload.java:文件下载工具类相关推荐

  1. Java文件下载工具类

    各种文件下载 /** 文件下载工具类 */public void downloadFile(HttpServletResponse response,String url)throws Unsuppo ...

  2. java图片缩放工具类,一个JAVA图形缩放处置工具类

    一个JAVA图形缩放处理工具类 调用的例子 import java.io.FileOutputStream; import java.io.IOException; import javax.imag ...

  3. JAVA I/O流工具类TextFile

    JAVA I/O流工具类TextFile由广州疯狂软件java培训分享: 本文是一个TextFile类,通过这个类我们可以调用其中的方法来简化对文件的读写,这段代码的可用性比较强.这个TextFile ...

  4. java redis remove_最全的Java操作Redis的工具类

    RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...

  5. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  6. java 代理ip工具类_Java基础之java处理ip的工具类

    java处理ip的工具类,包括把long类型的Ip转为一般Ip类型.把xx.xx.xx.xx类型的转为long类型.根据掩码位获取掩码.根据 ip/掩码位 计算IP段的起始IP.根据 ip/掩码位 计 ...

  7. java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]

    java练习(数组工具类的封装)[目前写过最长的代码,虽然不难] package myUtil.arrayUtil;public class ArraysUtil {/*** 升序排列一个byte数组 ...

  8. java工具类应该抛异常吗,java学习阶段一 工具类(异常)

    java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...

  9. java Excel导入导出工具类 及使用demo

    java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...

最新文章

  1. 某程序员吐槽:回老家被乡镇公务员表哥怼,催他赶紧上岸!表哥月薪3800,而他年包90w!...
  2. LeetCode 206 Reverse Linked List--反转链表--迭代与递归解法--递归使用一个临时变量,迭代使用3个
  3. 摄像头自建html直播,html5调用摄像头实现拍照
  4. PHP封装返回Ajax字符串和JSON数组
  5. 一个程序看fputc和fgetc
  6. 【转】Android Studio系列教程一--下载与安装
  7. linux中的umask 函数
  8. Angular Component的默认changeDetection策略
  9. 使用 rem 实现 适配各种屏幕布局
  10. gps test free android,GPSTest | F-Droid - Free and Open Source Android App Repository
  11. HTML基础概念——head头部,及标签(文本、图像类型)
  12. 随想录(尝试wsl安装)
  13. 【java学习之路】(java SE篇)(练习)常用类和异常的简单练习
  14. 微型计算机工作原理详细,微型计算机基本工作原理.ppt
  15. Android项目:天气预报App
  16. JAVA_判断日期是否为工作日(排除节假日和调整周末上班)
  17. 华为ne20路由器登陆密码_很好的文章,主要是关于密码学和NE的基础知识
  18. 用CSS实现立方体360度旋转
  19. shell学习(一)简单示例help用法
  20. 使用telnet连接qq pop服务器拉取邮件

热门文章

  1. 联发科梦碎高端化:2015年净利恐降4成股价腰斩
  2. 最后的配置部分:LNMP+Tomcat
  3. 从零开始开发JVM语言(七)语义分析的起步
  4. SSO (单点登录)实现方式
  5. 【简报】kube框架结构-一个小型响应式CSS框架
  6. Josephus 线段数版
  7. oracle连接中出现错误ORA-12541,ORA-12514,ORA-01017的解决方法
  8. Practical Mathematical Handwriting
  9. JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
  10. 用$.getJSON() 和$.post()获取第三方数据做页面 ——惠品折页面(1)