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/