2017-07-19 103 views
0

我在Spring Boot應用程序中發送郵件時使用MimeMessageHelperSpring MimeMessageHelper附件文件名編碼

如何告訴它編碼文件名,其中包含字母à,以便它能正確顯示?

構建MimeMessageHelper時編碼設置爲UTF-8似乎沒有幫助。在Gmail中,生成的附件顯示爲

=?UTF-8?Q?ex-comp_s.=C3=A0_r.l.?= =?UTF-8?Q?-201\";  filename*1=\"7-07-12_=E2=80=95_2017-07-18 

回答

0

我有類似的問題需要下載西里爾文件名。解決的辦法是編碼的文件名(rfc5987):

public static String rfc5987_encode(final String s) throws UnsupportedEncodingException { 
     final byte[] s_bytes = s.getBytes("UTF-8"); 
     final int len = s_bytes.length; 
     final StringBuilder sb = new StringBuilder(len << 1); 
     final char[] digits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 
     final byte[] attr_char = {'!','#','$','&','+','-','.','0','1','2','3','4','5','6','7','8','9',   'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','^','_','`',      'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','|', '~'}; 
     for (int i = 0; i < len; ++i) { 
      final byte b = s_bytes[i]; 
      if (Arrays.binarySearch(attr_char, b) >= 0) 
       sb.append((char) b); 
      else { 
       sb.append('%'); 
       sb.append(digits[0x0f & (b >>> 4)]); 
       sb.append(digits[b & 0x0f]); 
      } 
     } 

     return sb.toString(); 
    } 

,並使用這種方式:

private static final String CONTENT_DISP_PREFIX = "attachment; filename="; 
private static final String CONTENT_DISP_EXTRA_PREFIX = "attachment; filename*=UTF-8''"; 
private static final String USER_AGENT_FIREFOX = "Firefox"; 
... 
if (!ua.contains(USER_AGENT_FIREFOX)) { 
      response.setHeader(CONTENT_DISP_HEADER, CONTENT_DISP_PREFIX + "\"" + encodedFileName + "\""); 
     } else { 
      response.setHeader(CONTENT_DISP_HEADER, CONTENT_DISP_EXTRA_PREFIX + encodedFileName); 
     } 

我在這裏找到這個解決方案:http://outofrange.ru/2016/11/encode-non-ascii-filename-content-disposition/