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

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

================================

©Copyright 蕃薯耀 2018年6月26日

http://fanshuyao.iteye.com/

 

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

 

使用方法例子:

public void downloadExcelFileForPlaceNameQuery(HttpServletRequest request, HttpServletResponse response){
		try {
			Row row = parseRequestParametersToRow(request);
			Properties  prop = PropertiesUtils.read("placeName.properties");
			String destDir = prop.getProperty("destDirForPlaceNameQuery");
			String absoluteFilePath = destDir + row.getString("destFileName");
			DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
			String nowString = format.format(new Date());
			this.downloadFile(request, response, absoluteFilePath, "地名管理综合查询-" + nowString, true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void downloadFileCommon(HttpServletRequest request, HttpServletResponse response){
		try {
			Row row = parseRequestParametersToRow(request);
			this.downloadFile(request, response, row.getString("absoluteFilePath"), row.getString("fileDownloadName"), true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

 

(如果你觉得文章对你有帮助,欢迎捐赠,^_^,谢谢!) 


    

 

================================

©Copyright 蕃薯耀 2018年6月26日

http://fanshuyao.iteye.com/

猜你喜欢

转载自fanshuyao.iteye.com/blog/2425604