SpringBoot ajax文件下载实现

  • Post author:
  • Post category:其他


实现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;

}



版权声明:本文为baidu_29609961原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。