java上传下载文件。二次元开发工具类(功能丰富)。可以手动设置上传下载配置,不多说上码

package cn.mh.elect.util;


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

}
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页