java downloadfile_FileDownload.java:文件下载工具类
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:文件下载工具类相关推荐
- Java文件下载工具类
各种文件下载 /** 文件下载工具类 */public void downloadFile(HttpServletResponse response,String url)throws Unsuppo ...
- java图片缩放工具类,一个JAVA图形缩放处置工具类
一个JAVA图形缩放处理工具类 调用的例子 import java.io.FileOutputStream; import java.io.IOException; import javax.imag ...
- JAVA I/O流工具类TextFile
JAVA I/O流工具类TextFile由广州疯狂软件java培训分享: 本文是一个TextFile类,通过这个类我们可以调用其中的方法来简化对文件的读写,这段代码的可用性比较强.这个TextFile ...
- java redis remove_最全的Java操作Redis的工具类
RedisUtil 当前版本:1.1 增加更全的方法,对以前的部分方法进行了规范命名,请放心替换成新版本. 介绍 最全的Java操作Redis的工具类,使用StringRedisTemplate实现, ...
- java图形验证码生成工具类
转载自 java图形验证码生成工具类 生成验证码效果 ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...
- java 代理ip工具类_Java基础之java处理ip的工具类
java处理ip的工具类,包括把long类型的Ip转为一般Ip类型.把xx.xx.xx.xx类型的转为long类型.根据掩码位获取掩码.根据 ip/掩码位 计算IP段的起始IP.根据 ip/掩码位 计 ...
- java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]
java练习(数组工具类的封装)[目前写过最长的代码,虽然不难] package myUtil.arrayUtil;public class ArraysUtil {/*** 升序排列一个byte数组 ...
- java工具类应该抛异常吗,java学习阶段一 工具类(异常)
java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...
- java Excel导入导出工具类 及使用demo
java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...
最新文章
- 某程序员吐槽:回老家被乡镇公务员表哥怼,催他赶紧上岸!表哥月薪3800,而他年包90w!...
- LeetCode 206 Reverse Linked List--反转链表--迭代与递归解法--递归使用一个临时变量,迭代使用3个
- 摄像头自建html直播,html5调用摄像头实现拍照
- PHP封装返回Ajax字符串和JSON数组
- 一个程序看fputc和fgetc
- 【转】Android Studio系列教程一--下载与安装
- linux中的umask 函数
- Angular Component的默认changeDetection策略
- 使用 rem 实现 适配各种屏幕布局
- gps test free android,GPSTest | F-Droid - Free and Open Source Android App Repository
- HTML基础概念——head头部,及标签(文本、图像类型)
- 随想录(尝试wsl安装)
- 【java学习之路】(java SE篇)(练习)常用类和异常的简单练习
- 微型计算机工作原理详细,微型计算机基本工作原理.ppt
- Android项目:天气预报App
- JAVA_判断日期是否为工作日(排除节假日和调整周末上班)
- 华为ne20路由器登陆密码_很好的文章,主要是关于密码学和NE的基础知识
- 用CSS实现立方体360度旋转
- shell学习(一)简单示例help用法
- 使用telnet连接qq pop服务器拉取邮件
热门文章
- 联发科梦碎高端化:2015年净利恐降4成股价腰斩
- 最后的配置部分:LNMP+Tomcat
- 从零开始开发JVM语言(七)语义分析的起步
- SSO (单点登录)实现方式
- 【简报】kube框架结构-一个小型响应式CSS框架
- Josephus 线段数版
- oracle连接中出现错误ORA-12541,ORA-12514,ORA-01017的解决方法
- Practical Mathematical Handwriting
- JZOJ 3461. 【NOIP2013模拟联考5】小麦亩产一千八(kela)
- 用$.getJSON() 和$.post()获取第三方数据做页面 ——惠品折页面(1)