Java-MultipartEntityBuilder 内容和上传文件乱码问题

2020年06月16日 19:22 · 阅读(2082) ·

开发环境

名称 版本
操作系统 Windows 10 X64
JDK JDK1.8(jdk-8u151-windows-x64)
IntelliJ IDEA IntelliJ IDEA 2018.3
Maven Maven 3.6.0

参考

标题,内容乱码问题参考:https://blog.csdn.net/fengyuzhengfan/article/details/40792529

附件文件名乱码问题参考:https://www.cnblogs.com/evasean/p/9368670.html

问题描述

开发了一个发送邮件的功能,读取对应数据和文件作为邮件发送给用户,出现了下面的问题。

邮件标题:中文内容显示为 ?
邮件内容:中文内容显示为 ?
邮件附件:中文名称不显示。

原因分析

未修改前代码如下

  1. //Instantiate an HttpClient
  2. CloseableHttpClient httpclient = HttpClients.createDefault();
  3. HttpPost httpPost = new HttpPost(url);
  4. //set http header
  5. addAuthHeader(httpPost);
  6. //set http body
  7. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  8. builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式
  9. builder.setBoundary(boundary);
  10. builder.addTextBody("To",to);
  11. builder.addTextBody("CC",cc);
  12. builder.addTextBody("Bcc",bcc);
  13. builder.addTextBody("EmailType",param.getEmailType().toString());
  14. if(StringUtil.isBlank(param.getFrom())) builder.addTextBody("From",from);
  15. else builder.addTextBody("From",param.getFrom());
  16. //解决标题,内容中的中文乱码问题
  17. builder.addTextBody("Title",param.getTitle());
  18. builder.addTextBody("Content",param.getContent());
  19. builder.addTextBody("Priority",param.getPeriority().toString());
  20. builder.addTextBody("BodyFormat",param.getBodyFormat().toString());
  21. if(CollectionUtils.isNotEmpty(param.getAttachment())){
  22. for(MailAttaData itemAtta : param.getAttachment()){
  23. builder.addBinaryBody(
  24. "file",
  25. itemAtta.getStream(),
  26. ContentType.APPLICATION_OCTET_STREAM,
  27. itemAtta.getFileName()
  28. );
  29. }
  30. }

问题解决

解决附件名称中出现中文名不显示的问题

  1. //附件文件名乱码问题参考:https://www.cnblogs.com/evasean/p/9368670.html
  2. //解决上传文件中的中文乱码问题
  3. //BROWSER_COMPATIBLE自定义charset,RFC6532=utf-8,STRICT=iso-8859-1
  4. //此处一定要用RFC6532,网上普遍用的BROWSER_COMPATIBLE依然会出现中文名乱码
  5. builder.setMode(HttpMultipartMode.RFC6532);
  6. //builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式,这里的设置是无效的,依旧乱码

解决标题和内容中文显示为 ? 的问题

  1. //标题,内容乱码问题参考:https://blog.csdn.net/fengyuzhengfan/article/details/40792529
  2. //解决标题,内容中的中文乱码问题
  3. //builder.addTextBody("Title",param.getTitle());
  4. //builder.addTextBody("Content",param.getContent());
  5. ContentType contentType= ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
  6. builder.addPart("Title",new StringBody(param.getTitle(),contentType));
  7. builder.addPart("Content",new StringBody(param.getContent(),contentType));

修改后的完整代码

  1. //Instantiate an HttpClient
  2. CloseableHttpClient httpclient = HttpClients.createDefault();
  3. HttpPost httpPost = new HttpPost(url);
  4. //set http header
  5. addAuthHeader(httpPost);
  6. //set http body
  7. MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  8. //附件文件名乱码问题参考:https://www.cnblogs.com/evasean/p/9368670.html
  9. //解决上传文件中的中文乱码问题
  10. //BROWSER_COMPATIBLE自定义charset,RFC6532=utf-8,STRICT=iso-8859-1
  11. //此处一定要用RFC6532,网上普遍用的BROWSER_COMPATIBLE依然会出现中文名乱码
  12. builder.setMode(HttpMultipartMode.RFC6532);
  13. //builder.setCharset(Charset.forName(HTTP.UTF_8));//设置请求的编码格式,这里的设置是无效的,依旧乱码
  14. builder.setBoundary(boundary);
  15. builder.addTextBody("To",to);
  16. builder.addTextBody("CC",cc);
  17. builder.addTextBody("Bcc",bcc);
  18. builder.addTextBody("EmailType",param.getEmailType().toString());
  19. if(StringUtil.isBlank(param.getFrom())) builder.addTextBody("From",from);
  20. else builder.addTextBody("From",param.getFrom());
  21. //标题,内容乱码问题参考:https://blog.csdn.net/fengyuzhengfan/article/details/40792529
  22. //解决标题,内容中的中文乱码问题
  23. //builder.addTextBody("Title",param.getTitle());
  24. //builder.addTextBody("Content",param.getContent());
  25. ContentType contentType= ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
  26. builder.addPart("Title",new StringBody(param.getTitle(),contentType));
  27. builder.addPart("Content",new StringBody(param.getContent(),contentType));
  28. builder.addTextBody("Priority",param.getPeriority().toString());
  29. builder.addTextBody("BodyFormat",param.getBodyFormat().toString());
  30. if(CollectionUtils.isNotEmpty(param.getAttachment())){
  31. for(MailAttaData itemAtta : param.getAttachment()){
  32. builder.addBinaryBody(
  33. "file",
  34. itemAtta.getStream(),
  35. ContentType.APPLICATION_OCTET_STREAM,
  36. itemAtta.getFileName()
  37. );
  38. }
  39. }

测试结果