応答ヘッダ伝達中国語手動符号化(url符号化、base 64符号化)


  • 応答ヘッダ:Content-Disposition
  • 形式:Content-Disposition:attachment;filename=aaa.zip
  • の役割:ブラウザに添付ファイルのダウンロード形式でデータを取得することを通知する
  • 要求:動的に閲覧に1枚の画像を出力するが、直接表示するのではなく、添付ファイルで
  • をダウンロードする.
  • 応答ヘッダを設定し、ブラウザに添付ファイルでダウンロード取得データ
  • を通知する.
  • response.setHeader("Content-Disposition","attachment; filename=3.jpg");//ファイル名が中国語以外の場合は何の問題もありません.
  • response.setHeader("Content-Disposition","attachment;filename=自動車.jpg");//中国語であれば問題があります(応答ヘッダ伝達中国語はデフォルトでurl符号化されませんので、中国語を伝達できません.手動でurl符号化する必要があります(要求体と要求行、応答体はこれらが中国語データを伝達すると自動的にurl符号化されます)
  • 手動url符号化異なるブラウザ異なる
  • ieブラウザによるurl符号化
  • 他のブラウザによるbase 64符号化
  • 固定コードセグメント(ダイレクトコピー可能)
  •      String fileName="  .jpg";
            String ua = request.getHeader("User-Agent");
            boolean IE_LT11 = ua.contains("MSIE"); // IE11    
            boolean IE11 = ua.contains("rv:11.0) like Gecko"); // IE11
            boolean Edge = ua.contains("Edge"); // win10   Edge   
            //          ,    UTF-8  
            if (IE_LT11 || IE11 || Edge) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
                // java               :    ,java         ,
                //           %20,   +   %20,              
                fileName = fileName.replace("+", "%20");
            }
            //        Base64  
            else {
                Base64.Encoder encoder = Base64.getEncoder();
                fileName = encoder.encodeToString(fileName.getBytes("utf-8"));
                // =?utf-8?B?   ?=        Base64    
                fileName = "=?utf-8?B?" + fileName + "?=";
            }
    		 response.setHeader("Content-Disposition","attachment; filename="+fileName);

     
  • ケース:
  • @WebServlet(name = "ContentDispositionServlet", urlPatterns = "/ContentDispositionServlet")
    public class ContentDispositionServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            /*
            *    :Content-Disposition
            *   :Content-Disposition: attachment; filename=aaa.zip
            *   :                 
            * */
    
            //  :           ,        ,       
            //     ,              
            //response.setHeader("Content-Disposition","attachment; filename=3.jpg");//              
            //response.setHeader("Content-Disposition","attachment; filename=  .jpg");//          
            //             url  ,        ,      url  (       ,                 url  )
            //  url           
            //      1.ie     url  
            //     2.       base64  
            String fileName="  .jpg";
            String ua = request.getHeader("User-Agent");
            boolean IE_LT11 = ua.contains("MSIE"); // IE11    
            boolean IE11 = ua.contains("rv:11.0) like Gecko"); // IE11
            boolean Edge = ua.contains("Edge"); // win10   Edge   
            //          ,    UTF-8  
            if (IE_LT11 || IE11 || Edge) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
                // java               :    ,java         ,
                //           %20,   +   %20,              
                fileName = fileName.replace("+", "%20");
            }
            //        Base64  
            else {
                Base64.Encoder encoder = Base64.getEncoder();
                fileName = encoder.encodeToString(fileName.getBytes("utf-8"));
                // =?utf-8?B?   ?=        Base64    
                fileName = "=?utf-8?B?" + fileName + "?=";
            }
    		
            response.setHeader("Content-Disposition","attachment; filename="+fileName);
    
            String realPath = getServletContext().getRealPath("img/3.jpg");
            System.out.println("realPath="+realPath);
            InputStream inputStream = new FileInputStream(realPath);
            byte[] bytes = new byte[1024];
            int length=-1;
            while((length=inputStream.read(bytes))!=-1){
                //             
                response.getOutputStream().write(bytes,0,length);
            }
            //   
            inputStream.close();
        }
    }