Java文件下载,Java文件下载中文乱码,Java通用文件下载

public String getRealPath(HttpServletRequest request){  
    return request.getSession().getServletContext().getRealPath("/");  
}  
      
/** 
 * 通用文件下载方法 
 * @param request HttpServletRequest 
 * @param response HttpServletResponse 
 * @param absoluteFilePath String 文件的绝对路径,如:c:/a/a.txt 
 * @param fileDownloadName String 自定义文件下载显示的名称 
 * @param isDeleteAfterDownload boolean 用户下载文件后是否删除服务器的源文件,true删除,其它否 
*/  
public void downloadFile(HttpServletRequest request, HttpServletResponse response,   
        String absoluteFilePath, String fileDownloadName, boolean isDeleteAfterDownload){  
    InputStream is = null;  
    OutputStream os = null;  
    File file = null;  
    try{  
        logger.info("开始时间:"+System.currentTimeMillis());  
          
          
        file = new File(absoluteFilePath);  
        if(!file.exists()){  
            throw new RuntimeException("文件不存在:"+file.getAbsolutePath());  
        }  
        is = new BufferedInputStream(new FileInputStream(file));  
          
        String suffix = absoluteFilePath.substring(absoluteFilePath.lastIndexOf("."));  
        if(".xls".equalsIgnoreCase(suffix) || ".xlsx".equalsIgnoreCase(suffix)){  
            response.setContentType("application/vnd.ms-excel");  
        }else if(".doc".equalsIgnoreCase(suffix) || ".docx".equalsIgnoreCase(suffix)){  
            response.setContentType("application/vnd.msword");  
        }else if(".exe".equalsIgnoreCase(suffix)){  
            response.setContentType("application/octet-stream");  
        }else if(".jpe".equalsIgnoreCase(suffix) || ".jpeg".equalsIgnoreCase(suffix) || ".jpg".equalsIgnoreCase(suffix)){  
            response.setContentType("image/jpeg");  
        }else if(".png".equalsIgnoreCase(suffix)){  
            response.setContentType("image/png");  
        }else if(".gif".equalsIgnoreCase(suffix)){  
            response.setContentType("image/gif");  
        }else if(".mp3".equalsIgnoreCase(suffix)){  
            response.setContentType("audio/x-mpeg");  
        }else if(".mp4".equalsIgnoreCase(suffix) || ".mpg4".equalsIgnoreCase(suffix)){  
            response.setContentType("video/mp4");  
        }else if(".wm".equalsIgnoreCase(suffix)){  
            response.setContentType("video/x-ms-wm");  
        }else if(".wmv".equalsIgnoreCase(suffix)){  
            response.setContentType("audio/x-ms-wmv");  
        }else if(".rm".equalsIgnoreCase(suffix) || ".rmvb".equalsIgnoreCase(suffix)){  
            response.setContentType("audio/x-pn-realaudio");  
        }else if(".xml".equalsIgnoreCase(suffix)){  
            response.setContentType("text/xml");  
        }else if(".gz".equalsIgnoreCase(suffix)){  
            response.setContentType("application/x-gzip");  
        }else if(".gtar".equalsIgnoreCase(suffix)){  
            response.setContentType("application/x-gtar");  
        }else if(".tar".equalsIgnoreCase(suffix) || ".taz".equalsIgnoreCase(suffix)){  
            response.setContentType("application/x-tar");  
        }else if(".rar".equalsIgnoreCase(suffix)){  
            response.setContentType("application/x-rar-compressed");  
        }else if(".zip".equalsIgnoreCase(suffix)){  
            response.setContentType("application/zip");  
        }else{  
            response.setContentType("multipart/form-data");  
        }  
          
        //处理自定义文件名,如果没有自定义文件名,使用原来的文件名进行下载  
        if(StringUtils.isBlank(fileDownloadName)){//org.apache.commons.lang.StringUtils  
            fileDownloadName = file.getName().substring(file.getName().lastIndexOf("."));  
        }else{  
            if(fileDownloadName.indexOf(".") > -1){  
                fileDownloadName = fileDownloadName.substring(fileDownloadName.lastIndexOf("."));  
            }  
        }  
          
        //文件名编码,解决中文乱码问题  
        String userAgent = request.getHeader("User-Agent").toLowerCase();  
        if(userAgent.contains("msie")   
                || userAgent.contains("trident")   
                || userAgent.contains("like gecko")  
                || userAgent.contains("edge")){//IE浏览器  
              
            fileDownloadName = URLEncoder.encode(fileDownloadName, "UTF-8");  
            fileDownloadName = fileDownloadName.replaceAll("\\+", "%20");//处理文件名多余的加号(+)  
        }else{//其它浏览器  
            fileDownloadName = new String(fileDownloadName.getBytes("UTF-8"), "ISO-8859-1");  
        }  
          
        response.setCharacterEncoding("UTF-8");  
        response.addHeader("Content-Disposition", "attachment;filename=\"" + fileDownloadName + suffix + "\"");  
        response.addHeader("Content-Length", "" + file.length());  
          
        os = response.getOutputStream();  
          
        byte[] buffer = new byte[1024];  
        int length = 0;  
        while((length = is.read(buffer)) > 0){  
            os.write(buffer, 0, length);  
        }  
        logger.info("结束时间:"+System.currentTimeMillis());  
    }catch(Exception e){  
        e.printStackTrace();  
        logger.info("下载文件出错:"+e.getCause());  
    }finally{  
        try {  
            if(os != null){  
                //os.flush();  
                os.close();  
            }  
            if(is != null){  
                is.close();  
            }  
            if(isDeleteAfterDownload){  
                if(file != null){  
                    //org.apache.commons.io.FileUtils  
                    FileUtils.deleteQuietly(file);  
                }  
            }  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
    }  
}  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值