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