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;
    }

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加班狂魔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值