ajax異步下載文件

最近捯飭公司項目,需要用到ajax下載文件,所以百度了一番,綜合解決方案如下:

前端ajax:

 var url = '<%=basePath%>enterprise/exportExcel?enterpriseIds='+ids;
            var xhr=null;
            try {
               xhr=new XMLHttpRequest()
            }catch(e) {
               xhr=new ActiveXObject("Microsoft.XMLHTTP")
            }
            xhr.open('POST', url, true);
         xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.responseType = "blob"; // 返回類型blob
            // 定義請求完成的處理函數,請求前也可以增加加載框/禁用下載按鈕邏輯
            xhr.onload = function () {
            // 請求完成
        if (this.status === 200) {//返回200
            var blob = this.response;
               var reader = new FileReader();
               reader.readAsDataURL(blob);    //轉換爲base64,可以直接放入a表情href
            reader.onload = function (e) {
            // 轉換完成,創建一個a標籤用於下載
            var a = document.createElement('a');
            a.download = '客戶列表.xlsx';
            a.href = e.target.result;
            $("body").append(a); //修復firefox中無法觸發click
            a.click();
            $(a).remove();
           }
       }};
          //發送ajax請求
          xhr.send();

 

後臺處理:

// 導出客戶報表
    @RequestMapping(value = "/exportExcel")
    public void exportExcel(String enterpriseIds, HttpServletResponse response) {
        UserOnlineBean userOnlineBean = getUserOnlineBean();
        if (null != userOnlineBean) {
            try {
                // 報表客戶信息集開始
                List<Integer> ids = SplitParmeter.splitInteger(enterpriseIds, ",");
                XSSFWorkbook wb = enterpriseService.exportExcel(ids);
                if (null != wb) {
                    String title = "客戶報表";
                    String filename = new String(title.getBytes("gb2312"), "ISO8859-1");
                    response.reset();
                    response.setContentType(
                            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
                    response.setHeader("Content-Disposition", "attachment; filename=" + filename + ".xlsx");
                    OutputStream out = response.getOutputStream();
                    wb.write(out);
                    out.close();
                }
            } catch (ServiceException e) {
            } catch (Exception e) {
                log.error("生成客戶報表發生錯誤!", e);
            }
        }
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章