SpringBoot ajax文件下載實現

實現Ajax文件下載可以從後臺直接返回一個Base64編碼格式的文件,在前臺用JS的atob()方法直接轉爲Blob格式的數據,然後創建一個A標籤,來下載它。

前臺 JS

function doAjaxDownload() {
    $.ajax({
        type : "post",
        url : "/Sample/ajaxDownload",
        dataType : "json",
        data : {},
        success : function(data) {
            if (data.errMsg) {
                addMessage("messageArea", "", data.errMsg);
            } else {
                ajaxFileDownload(data.file, data.filename);
            }
        }
    });
}

/**
 * CSVファイルダウンロード処理(AJax)
 * 
 * @param data BASE64ファイル
 * @param filename 名
 */
function ajaxFileDownload(data,filename) {
    var a = document.createElement('a');
    var bstr = atob(data), n = bstr.length, u8arr = new Uint8Array(n);
    while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
    }
    var blob =  new Blob([u8arr], { type: "application/octet-stream" });
    var url = window.URL.createObjectURL(blob);
    a.href = url;
    a.download = filename;
    a.click();
    window.URL.revokeObjectURL(url);
}

後臺代碼
    @LogManage(description = "Controller Method「ajaxDownload()」")
    @RequestMapping(value = "ajaxDownload", method = RequestMethod.POST)
    @ResponseBody
    public Map<String,String> ajaxDownload( HttpSession session,
            MSV0120FormDataBean formDataBean) throws IOException {
        List csvData = service.doSelect();

        List<String> csvRowList = new ArrayList<String>();
        Object[] header = new Object[] {"COL1", "COL2", "COL3", "COL4"};
        csvRowList.add(CommonUtil.arrayToString(header, ","));
        for (int i = 0; i < csvData.size(); i++) {
            Object[] strArray = (Object[]) csvData.get(i);
            csvRowList.add(CommonUtil.arrayToString(strArray, ","));
        }
        File csvFile = File.createTempFile("SAMPLE", ".csv");
        String fileEncode = SpringUtil.getBean(CommonConfig.class).getFileEncode();
        OutputStream os = null;
        try {
            
            os = new FileOutputStream(csvFile);
            os.write(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF });
            for (String row : csvRowList) {
                os.write(row.getBytes(fileEncode));
                os.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileInputStream inputFile = new FileInputStream(csvFile);
        byte[] buffer = new byte[(int)csvFile.length()];
        inputFile.read(buffer);
        inputFile.close();
        Map<String,String> result = new HashMap<String,String>();
        result.put("file", Base64Utils.encodeToString(buffer));
        result.put("filename", "SAMPLE.csv");
        return result;
    }

 

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