[JAVA]異なるブラウザで添付ファイルをダウンロードする中国語名の文字化けし問題を解決する

3772 ワード

添付ファイルのダウンロード時、中国語添付ファイル名の互換性の問題に遭遇し、firefox、chrome、ieの3つの派閥は互換性がなく、分析整理を通じて、この問題を処理する方法をまとめ、以下のように記録した.
1、ファイル名コード
サーバのデフォルトはISO 8859-1ですが、javaコードではUTF-8がデフォルトで使われていますので、サーバに渡すときに変換する必要があります.
2、ブラウザによるファイル名の扱い方
マイクロソフトは添付ファイル名を扱う際に使用するURL復号処理であるため、マイクロソフト系のブラウザを個別に扱う必要がある
 
コードは次のとおりです.
    public String dealAttachmentName(HttpServletRequest req, String fileName) throws UnsupportedEncodingException {
        String userAgent = req.getHeader("user-agent");
        boolean isMSBrowser = HttpUtils.isMSBrowser(userAgent);
        // URLEncoder            ,    "%20",      "+",        
        return isMSBrowser ? URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20") : new String(fileName.getBytes("UTF-8"), "ISO8859-1");
    }

 
/**
 * @description:
 * @projectName:mysteel-oilchem-information-columnlist
 * @see:com.mysteel.oilchem.cms.web.utils
 * @author:   
 * @createTime:2019/4/28 10:03
 * @version:1.0
 */
public class HttpUtils {
    private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};

    /**
     * description            
     *          URLencoder  
     * param [request]
     * return boolean
     * author    
     * createTime 2019/4/28 10:05
     **/
    public static boolean isMSBrowser(String userAgent) {
        if (userAgent != null) {
            for (String signal : IEBrowserSignals) {
                if (userAgent.contains(signal))
                    return true;
            }
        }
        return false;
    }

}

ファイル名符号化問題の処理が完了したら、応答ヘッダに設定すればよい.
    response.setHeader("Content-disposition","attachment; filename=" + realFilename);

 
参照先:
servletのよくある文字化けしと解決方法