SpringMVC下载不支持IE 和其他浏览器兼容模式,和IE 中文乱码问题

本文介绍了一种处理浏览器下载文件时出现乱码的方法,针对IE、Chrome和Firefox等不同浏览器,通过编码转换确保文件名正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/** 
    *  
    * @Title: processFileName 
    *  
    * @Description: ie,chrom,firfox下处理文件名显示乱码 
    */  
   public static String processFileName(HttpServletRequest request, String fileNames) {  
       String codedfilename = null;  
       try {  
           String agent = request.getHeader("USER-AGENT");  
           if (null != agent && -1 != agent.indexOf("MSIE") || null != agent  
                   && -1 != agent.indexOf("Trident")) {// ie  
  
               String name = java.net.URLEncoder.encode(fileNames, "UTF8");  
  
               codedfilename = name;  
           } else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等  
  
  
               codedfilename = new String(fileNames.getBytes("UTF-8"), "iso-8859-1");  
           }  
       } catch (Exception e) {  
           e.printStackTrace();  
       }  
       return codedfilename;  
   }  


原文地址:http://blog.youkuaiyun.com/heyanfeng22/article/details/49453405




@RequestMapping(value="downLoadTest.do")
public ResponseEntity<byte[]> download(String id,String userid,HttpServletRequest request) throws IOException {
SystemUser user = (SystemUser) request.getSession().getAttribute("user");
boolean mark = false;
System.out.println("下载开始:" + new Date().getTime());
//生成uuid 以免生成的文件与客户端重复
String uuid = UUID.randomUUID().toString();
List list = service.downloadfile(id, user.getUsername());// 下载矩阵文件
mark = new MatrixController().createTxt(list,uuid);
System.out.println("下载结束:" + new Date().getTime());
if(mark){
String fileName = userid+uuid+".txt";
//从服务器中的指定地址拿文件,然后判断文件是否存在
File file = new File("d:/" + fileName);
String dfileName = new String(fileName.getBytes("UTF-8"), "iso8859-1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//headers.setContentDispositionFormData("attachment", dfileName);
headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");

return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}else{ //生成矩阵文件失败,生成空文件给出提示
String fileName = "矩阵信息不存在.txt";
String codedfilename = processFileName(request,fileName);
//从服务器中的指定地址拿文件,然后判断文件是否存在
File file = new File("d:/" + fileName);
if(!file.exists()){
file.createNewFile();
}
String dfileName = new String(fileName.getBytes("UTF-8"), "iso8859-1");
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", codedfilename);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}

}
将HttpStatus.CREATED 更改为 HttpStatus.OK
更详细的相似问题及解决方案查看 http://blog.youkuaiyun.com/xht555/article/details/48495967
你是一名专业的java工程师,在使用springboot结合docx4j,将InputStream流转为word文档时,并将word文档下载到客户端上。通过postman下载下来的中文名称为乱码。以下是代码 InputStream htmlStream = minioUtils.downloadFileByBucketNameAndFileName("", content.split(bucketName)[1]); // 1. 读取 HTML 内容 String html = IOUtils.toString(htmlStream, StandardCharsets.UTF_8); // 2. 创建 Word 文档 WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); // 3. 导入 HTML 内容 XHTMLImporterImpl importer = new XHTMLImporterImpl(wordPackage); wordPackage.getMainDocumentPart().getContent().addAll( importer.convert(html, null) ); // 4. 保存到输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Docx4J.save(wordPackage, outputStream, Docx4J.FLAG_SAVE_ZIP_FILE); // 3. 设置响应头(处理中文文件名) String fileName = contentMaster.getName() + ".docx"; String encodedFileName = URLEncoder.encode(fileName, "UTF-8") .replaceAll("\\+", "%20"); InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); return ResponseEntity.ok() .header("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName + ";" + // RFC5987 " filename=\"" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1) + "\"") // 传统兼容 .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(new InputStreamResource(inputStream)); 给出你的解决方案
最新发布
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值