import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import sun.misc.BASE64Encoder;
/**
*
* @项目名称:elect_410
* @类名称:UploadDownLoadFilesUtils
* @类描述: 该类主要提供上传文件和下载文件这两种功能,如果上传或下载失败请设置跳转的方法setUploadFileFailHint(String jspPage)
* 底层代码使用了fileupload.jar自动解析上传文件,支持多文件上传,前台一定要用js设置限制文件大小,上传文件报错信息
* (单个文件的大小和总文件的大小,超过了设置)保存在request域中 request.setAttribute(message,“”)
* 前天可以从request域中获取
* @创建人:曹明杰
* @创建时间:2018-2-8 下午10:34:29
* @修改人:曹明杰
* @修改时间:2018-2-8 下午10:34:29
* @修改备注:
* @version
*
*/
public class UploadDownLoadFilesUtils {
//用于保存当前线程的私有变量map,map详情介绍看getCurMap注释
static final ThreadLocal local = new ThreadLocal();
private static String getSavePath(){
//获得保存文件的地址
String savePath = (String) getCurMap().get(3);
//如果没有设置,则默认为/WEB-INF/upload
if(StringUtils.isBlank(savePath)){
savePath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/upload");//为默认
}else{
savePath = ServletActionContext.getServletContext().getRealPath(savePath);
}
return savePath;
}
/**
* @描述: 设置上传的临时文件的路径
* @标题: setSavePath
* @作者: 曹明杰 2018-2-9创建
* @param uploadPath
* @返回类型:void
* @更新:无
*/
public static void setSaveTempPath(String uploadTempPath){
getCurMap().put(4, uploadTempPath);
}
private static String getSaveTempPath(){
//获得保存文件的临时地址
String uploadTempPath = (String) getCurMap().get(4);
//如果没有设置,则默认为/WEB-INF/temp
if(StringUtils.isBlank(uploadTempPath)){
uploadTempPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/temp");//为默认
}else{
uploadTempPath = ServletActionContext.getServletContext().getRealPath(uploadTempPath);
}
return uploadTempPath;
}
/**
* @描述: 设置上传的路径
* @标题: setSavePath
* @作者: 曹明杰 2018-2-9创建
* @param uploadPath
* @返回类型:void
* @更新:无
*/
public static void setSavePath(String uploadPath){
getCurMap().put(3, uploadPath);
}
/**
* @描述:文件上传,默认上传的地址:/WEB-INF/upload,临时上传地址:/WEB-INF/temp
* 支持多文件上传,前台一定要用js设置限制文件大小,上传文件报错信息(单个文件的大小和总文件的大小,超过了设置)保存在request域中 request.setAttribute(message,“”)
* 前天可以从request域中获取
* @标题: uploadFile
* @param request 封装上传文件的请求对象
* @作者: 曹明杰 2018-2-9创建
* @返回类型:List 返回保存文件的全路径名(包括文件名和格式,文件的上传名为UUID_fileName.格式)
* @更新:无
*/
public static List<String> uploadFile(HttpServletRequest request){
//存放文件的路径和名字(包括格式)
List<String> filePathList = null;
setHttpServletRequest(request);
//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = getSavePath();
//上传时生成的临时文件保存目录
String tempPath = getSaveTempPath();
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
//创建临时目录
tmpFile.mkdir();
}
//消息提示
String message = "";
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024*1024*2);//设置缓冲区的大小为2MB,如果不指定,那么缓冲区的大小默认是10KB
//设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);
//2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//监听文件上传进度
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
/**
* 文件大小为:14608,当前已处理:4096
* 文件大小为:14608,当前已处理:7367
* 文件大小为:14608,当前已处理:11419
* 文件大小为:14608,当前已处理:14608
*/
}
});
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){
//按照传统方式获取数据
return null;
}
/**这里设置的单个文件和总文件的大小特别大,目的是让控制文件的大小权限下移,请看下面的代码**/
//设置上传单个文件的大小的最大值,目前是设置为long的最大值
upload.setFileSizeMax(Long.MAX_VALUE);
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为long的最大值
upload.setSizeMax(Long.MAX_VALUE);
int allSize = request.getContentLength();//所有文件的总大小
/**检查所有上传文件大小是否合格**/
if(getAllFilesSizeMax()<allSize){//判断所有文件的大小,如果没有设置单个文件的大小,默认是Long的最大值
request.setAttribute(message, "超过了总文件设置的大小,总文件大小为:"+getAllFilesSizeMax());
return null;
}
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
try {
@SuppressWarnings("unchecked")
List<FileItem> list = upload.parseRequest(request);
//List<FileItem> list2 = upload.parseRequest(request);
filePathList = new ArrayList<String>();
for(FileItem item : list){
//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
String name = item.getFieldName();
//解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
//value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
}else{
//如果fileitem中封装的是上传文件
//得到上传的文件名称,
long size = item.getSize()/1024; //获得文件的字节数
/**检查文件是否合格**/
if(size>getFileSizeMax()){ //判断单个文件的大小,如果没有设置单个文件的大小,默认是Long的最大值
request.setAttribute(message, "名字为"+item.getFieldName()+"的上传文件超过了单个文件设置的大小(单个文件设置大小为:"+getFileSizeMax());
continue ;
}
String filename = item.getName();
System.out.println(filename);
if(filename==null || filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf(File.separatorChar)+1);
//得到上传文件的扩展名
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:"+fileExtName);
//获取item中的上传文件的输入流
InputStream in = item.getInputStream();
//得到文件保存的名称
String saveFilename = makeFileName(filename);
//得到文件的保存目录
String realSavePath = makePath(saveFilename, savePath);
//上传的路径和文件,
String realSavePath_realSavePath=realSavePath + File.separatorChar + saveFilename;
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(realSavePath_realSavePath);
//创建一个缓冲区
byte buffer[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=in.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
out.write(buffer, 0, len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
item.delete();
message = "文件上传成功!";
filePathList.add(realSavePath_realSavePath);//将上传完成的 路径和全名 法如放入到该集合。
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
}catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
}catch (Exception e) {
message= "文件上传失败!";
//e.printStackTrace();
}
return filePathList;
}
public static List<FileItem> getFileItemsFromRequest(){
return null;
}
/**
* @描述: 设置多文件上传时,所有上传文件的总大小,如果没有设置默认为设置单个文件的大小
* @标题: getAllFilesSizeMax
* @作者: 曹明杰 2018-3-7创建
* @return
* @返回类型:long
* @更新:无
*/
private static long getAllFilesSizeMax() {
Long allFilesSizeMax = (Long)getCurMap().get(7);//获取所有上传文件的总大小
if(allFilesSizeMax==null){
return getFileSizeMax();//默认使用设置单个文件上传的大小
}
return allFilesSizeMax;
}
/**
* @描述: 设置所有文件的总大小 单位:字节 kb
* @标题: setAllFilesSizeMax
* @作者: 曹明杰 2018-3-7创建
* @param allSize
* @返回类型:void
* @更新:无
*/
public static void setAllFilesSizeMax(Long allSize) {
getCurMap().put(7, allSize);
}
/**
* @描述: 上传失败后进行跳转的页面,如果不设置setUploadFileFailHint(String jspPage) 改方法,则此方法默认不跳转
* @标题: setExceptionSend
* @作者: 曹明杰 2018-2-9创建
* @返回类型:void
* @更新:无
*/
private static void setExceptionSend(){
//获得上传失败后跳转的页面
String hintJsp = getUploadFileFailHint();
//如果hintJsp为null则不跳转
if(StringUtils.isBlank(hintJsp)){
return ;
}
try {
getResponse().sendRedirect(getUploadFileFailHint());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @描述: 文件上传失败后 , 设置跳转的页面
* @标题: setUploadFileHint
* @作者: 曹明杰 2018-2-9创建
* @param jspPage 文件上传后要跳转的页面,一般为
* @返回类型:void
* @更新:无
*/
public static void setUploadFileFailHint(HttpServletResponse res,String jspPage){
//获得当前线程的map
Map<Integer, Object> map = getCurMap();
//把失败后跳转的页面地址存放在map中,key对应的是2
map.put(2, jspPage);
map.put(6, res);
}
/**
* @描述: 文件上传失败后 , 获得跳转的页面
* @标题: getUploadFileFailHint
* @作者: 曹明杰 2018-2-9创建
* @return
* @返回类型:String
* @更新:无
*/
private static String getUploadFileFailHint(){
Object object = getCurMap().get(2);
return (String)object;
}
/**
* @描述: 获得相应对象
* @标题: getResponse
* @作者: 曹明杰 2018-2-9创建
* @return
* @返回类型:HttpServletResponse
* @更新:无
*/
private static HttpServletResponse getResponse(){
return (HttpServletResponse) getCurMap().get(6);
}
/**
* @标题: makeFileName
* @描述: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称
* @作者:曹明杰
* @param: filename 文件的原始名称
* @返回类型: uuid+"_"+文件的原始名称
*/
private static String makeFileName(String filename){ //2.jpg
//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
return UUID.randomUUID().toString() + "_" + filename;
}
/**
*
* @标题: makePath
* @描述: 为防止一个目录下面出现太多文件,要使用hash算法打散存储
* @作者:曹明杰
* @param filename 文件名,要根据文件名生成存储目录
* @param savePath 文件存储路径
* @返回类型:新的存储目录
*/
private static String makePath(String filename,String savePath){
//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
int hashcode = filename.hashCode();
int dir1 = hashcode&0xf; //0--15
int dir2 = (hashcode&0xf0)>>4; //0-15
//构造新的保存目录
String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5
//File既可以代表文件也可以代表目录
File file = new File(dir);
//如果目录不存在
if(!file.exists()){
//创建目录
file.mkdirs();
}
return dir;
}
/**
* @描述:设置单个文件上传的大小
* @标题: setFileSizeMax
* @作者: 曹明杰 2018-2-9创建
* @param k(字节)
* @返回类型:void
* @更新:无
*/
public static void setFileSizeMax(Long bytes){
//获得当前线程的map
Map<Integer, Object> map = getCurMap();
//放入到当前线程map中,
map.put(1, bytes);
}
/**
*
* @描述: 获得单个文件上传的大小,如果不存在默认为1024*1024*5 kb ( 5M )
* @标题: getFileSizeMax
* @作者: 曹明杰 2018-2-9创建
* @返回类型:Long 字节数
* @更新:无
*/
private static Long getFileSizeMax(){
//拿去当前线程的map
Map<Integer, Object> curMap = getCurMap();
//获得当前设定的文件的大小值,1:代表文件的大小key
Long object = (Long)curMap.get(1);
//如果不存在默认为Long的最大值
if(object==null){
object = Long.MAX_VALUE;
}
return object;
}
/**
* @描述:获得当前线程的map,每个线程设定一个map,用来存放当前线程的私有变量
* @标题: getCurMap
* @作者: 曹明杰 2018-2-9创建
* @return 返回当前线程的map
* @返回类型:Map<Integer,Object> Integer:为1代表设置单个文件的大小,
* 为2代表设置文件上传失败后跳转的jsp页面的地址
* 为3代表上传的路径
* 为4代表临时路径
* 为5代表request对象
* 为6代表response对象
* 为7代表所有上传文件的总大小
* Object:为文件大小的值
* @更新:无
*/
private static Map<Integer, Object> getCurMap(){
//获取当前线程的map
Map<Integer, Object> map = (Map<Integer, Object>) local.get();
//如果不存在则创建一个新的map,并放入当前的线程
if(map==null){
map = new HashMap<Integer, Object>();
local.set(map);
}
return map;
}
/**
* @描述:或的当前的请求对象
* @标题: getRequest
* @作者: 曹明杰 2018-2-9创建
* @return
* @返回类型:HttpServletRequest
* @更新:无
*/
private static HttpServletRequest getRequest(){
HttpServletRequest request = (HttpServletRequest) getCurMap().get(5);
return (HttpServletRequest) request;
}
/**
* @描述: 设置请求对象,从该request对象中获取上传的文件 ,
* 不设置默认依赖struts2的ServletActionContext.getRequest();获取
* request对象,(默认当前使用的struts2框架)
* @标题: setHttpServletRequest
* @作者: 曹明杰 2018-3-6创建
* @返回类型:void
* @更新:无
*/
public static void setHttpServletRequest(HttpServletRequest request){
getCurMap().put(5, request);
}
/**
* @描述: 从请求对象中 获得上传文件 的流
* @标题: getInputStreamFromRequest
* @作者: 曹明杰 2018-3-2创建
* @return
* @返回类型:InputStream
* @更新:无
*/
public InputStream getInputStreamFromRequest(){
HttpServletRequest request = getRequest();
//上传时生成的临时文件保存目录
String tempPath = getSaveTempPath();
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
//创建临时目录
tmpFile.mkdir();
}
//使用Apache文件上传组件处理文件上传步骤:
//1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){
//按照传统方式获取数据
return null;
}
//设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是5MB
upload.setFileSizeMax(getFileSizeMax());
//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为50MB
upload.setSizeMax(getFileSizeMax()*10);
//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
try {
@SuppressWarnings("unchecked")
List<FileItem> list = upload.parseRequest(request);
//List<FileItem> list2 = upload.parseRequest(request);
for(FileItem item : list){
//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
String name = item.getFieldName();
//解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
//value = new String(value.getBytes("iso8859-1"),"UTF-8");
System.out.println(name + "=" + value);
}else{
//如果fileitem中封装的是上传文件
//得到上传的文件名称,
String filename = item.getName();
System.out.println(filename);
if(filename==null || filename.trim().equals("")){
continue;
}
//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\")+1);
//得到上传文件的扩展名
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);
//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法
System.out.println("上传的文件的扩展名是:"+fileExtName);
//获取item中的上传文件的输入流
InputStream in = item.getInputStream();
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "单个文件超出最大值!!!");
setExceptionSend();
return null;
}catch (FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");
setExceptionSend();
return null;
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* @描述: 在浏览器窗口弹出下载图片
* @标题: downLoadFilesToWebClient
* @作者: 曹明杰 2018-3-10创建
* @param inputStream 存放图片的输入流
* @param response 响应给浏览器
* @param fileName 下载的文件名
* @返回类型:void
* @更新:无
*/
public static void downLoadFilesToWebClient(InputStream inputStream,HttpServletResponse response,String fileName) {
try {
InputStream fis = new BufferedInputStream(inputStream);
byte[] buffer = new byte[fis.available()];
//fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes()));
response.addHeader("Content-Length", "" + fis.available());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
fis.read(buffer);
toClient.write(buffer);
toClient.flush();
toClient.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @描述: 在浏览器窗口弹出下载图片
* @标题: downLoadFilesToWebClient
* @作者: 曹明杰 2018-3-10创建
* @param inputStream 存放图片的输入流
* @param response 响应给浏览器
* @param fileName 下载的文件名
* @返回类型:void
* @更新:无
*/
public static void downLoadFilesToWebClient2(String filePath,HttpServletResponse response,String fileName) {
try {
InputStream fis = new BufferedInputStream(new FileInputStream(new File(filePath)));
byte[] buffer = new byte[fis.available()];
//fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes()));
response.addHeader("Content-Length", "" + fis.available());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
fis.read(buffer);
toClient.write(buffer);
toClient.flush();
toClient.close();
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @描述:
* @标题: downloadNet
* @作者: 曹明杰 2018-3-11创建
* @param response 响应对象
* @param URL url 如"windine.blogdriver.com/logo.gif"
* @param savePath 保存的路径
* @throws MalformedURLException
* @返回类型:void
* @更新:无
*/
public void downloadNet(HttpServletResponse response,String URL,String savePath) throws MalformedURLException {
// 下载网络文件
int bytesum = 0;
int byteread = 0;
URL url = new URL(URL);
try {
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs = new FileOutputStream(savePath);
byte[] buffer = new byte[1204];
int length;
while ((byteread = inStream.read(buffer)) != -1) {
bytesum += byteread;
System.out.println(bytesum);
fs.write(buffer, 0, byteread);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @描述: 在线打开文件,(不一定是图片)
* @标题: downLoad
* @作者: 曹明杰 2018-3-11创建
* @param filePath 文件的路径
* @param response 响应对象
* @param isOnLine true为在线打开,false为下载
* @throws Exception
* @返回类型:void
* @更新:无
*/
public static void onLineDownLoadOrShowForFile(String filePath, HttpServletResponse response, boolean isOnLine) throws Exception {
File f = new File(filePath);
if (!f.exists()) {
response.sendError(404, "File not found!");
return;
}
BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if (isOnLine) { // 在线打开方式
URL u = new URL("file:///" + filePath);
response.setContentType(u.openConnection().getContentType());
response.setHeader("Content-Disposition", "inline; filename=" + f.getName());
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + f.getName());
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
/**
* @描述: 在线打开或下载图片
* @标题: downLoad
* @作者: 曹明杰 2018-3-11创建
* @param inputStream 文件输入流
* @param response 响应对象
* @param isOnLine true为在线打开,false为下载
* @param fileName 文件名
* @throws Exception
* @返回类型:void
* @更新:无
*/
public static void onLineDownLoadOrShowForImage(InputStream inputStream, HttpServletResponse response, boolean isOnLine,String fileName) throws Exception {
BufferedInputStream br = new BufferedInputStream(inputStream);
byte[] buf = new byte[1024];
int len = 0;
response.reset(); // 非常重要
if (isOnLine) { // 在线打开方式
response.setContentType("image/jpeg");
response.setHeader("Content-Disposition", "inline; filename=" + fileName);
// 文件名应该编码成UTF-8
} else { // 纯下载方式
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
}
OutputStream out = response.getOutputStream();
while ((len = br.read(buf)) > 0)
out.write(buf, 0, len);
br.close();
out.close();
}
/**解决文件下载时的中文乱码显示的Name**/
public String encodeDownloadFilename(String filename, String agent) throws IOException{
if(agent.contains("Firefox")){ // 火狐浏览器
filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
}else{ // IE及其他浏览器
filename = URLEncoder.encode(filename,"utf-8");
}
return filename;
}
}