天天看點

POST 下載下傳檔案

需求背景

遇到個需求,需要根據使用者輸入的id清單下載下傳檔案。一般情況下,下載下傳檔案用GET請求就能滿足需求,但是,這個需求的請求參數中可能有上千個id,GET請求很可能超出浏覽器參數長度限制。那麼該怎麼解決這個問題呢?

解決方案

請求方式基本可以确定隻能用POST了,而直接用Ajax發POST請求是不行的。經過一番調研,總結兩種方案:

  1. 可以背景接到請求後生成下載下傳檔案,放到靜态檔案目錄,然後傳回檔案路徑,前端拿到路徑後用GET請求拉取檔案。此方案可行,但是我們的靜态檔案都在亞馬遜伺服器上,還要把檔案上傳到亞馬遜伺服器,然後前端去亞馬遜伺服器拉取檔案,總感覺繞個彎怪怪的。是以有了下邊的方案2;
  2. 用戶端使用POST表單送出請求,不要用Ajax。示例代碼如下:
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>下載下傳檔案示例程式</title>
    </head>
    <body>
    <button  onclick="downloadExcel()">下載下傳</button>
    <script type="text/javascript">
    
        function downloadExcel(){
            download("http://localhost:8080/download", {"ids": "10000,10002"});
        }
    
        /**
         * post方式下載下傳檔案
         * @param  {[string]} url  接口
         * @param  {[json]} data 資料
         * @return 
         */
        function download(url, data){
             var body = document.getElementsByTagName('body')[0];
            var form = document.createElement('form');
            form.method = 'POST';
            form.action = url;
            for(key in data){
                var param = document.createElement('input');
                param.type = "hidden";
                param.name = key;
                param.value = data[key];
                form.appendChild(param);
            }
            body.appendChild(form);
            form.submit();
            body.removeChild(form);
       }
    </script>
    </body>
    </html>
               

親測相容老IE,而且頁面無重新整理,問題解決。

備注

本人主背景,非專業前端,前端代碼寫的不好,僅供參考。

繼續閱讀