通过ajax异步请求下载文件的方法
在简单的项目中下载文件的方法都是通过一个get请求来下载文件,随着前后端分离,前端使用前端框架(vue,anglajs等)之类的node.js
通过异步请求来关联前后端,下载文件的时候使用get方式请求后端下载文件时,就显得不太合适。
下面介绍如何通过ajax异步请求下载一个zip压缩文件
前端发送一个ajax请求
var self = this;
this.$http({
method:'post',
url:self.config.serverUrl+"/url.json",
data:xxx,//参数
responseType: "arraybuffer"
}).then(function (response) {
if(response.status=='200'){
var n = new Blob([response.data], {type: "application/zip"}),
i = 文件名 + ".zip",
r = document.createElement("a");
r.href = URL.createObjectURL(n),
r.download = i,
document.body.appendChild(r),
r.click(),
window.setTimeout(function() {URL.revokeObjectURL(n),document.body.removeChild(r)},0);
}else{
alert(‘文件下载异常’);
}
}).catch(function (response) {
console.log(response);
});
代码中的发送ajax请求的方式可能跟各位的代码有所不同,主要是then方法体中的代码。
后端:
@RequestMapping(method= RequestMethod.POST,value="url.json",consumes="application/json;charset=UTF-8")
public void url(@RequestBody Map<String,Object> params, HttpServletRequest request, HttpServletResponse response){
//params为ajax异步请求带过来的参数(json格式转为map格式了)
//此处占时用不到这个params
//创建一个文件用于压缩
createdTxtFile();
//压缩成一个zip
//压缩
File file = new File("D://ccc.zip");
ZipUtil.zip(file,false,
FileUtil.file("D://logs//a.txt"));
byte[] data = file2ByteArray("D://ccc.zip");
response.reset();
response.setHeader("Content-Disposition", String.format("attachment; filename=%s.zip", "a"));
response.addHeader("Content-Length", "" + data.length);
response.setContentType("application/octet-stream; charset=UTF-8");
try {
IoUtil.write(response.getOutputStream(), Boolean.TRUE, data);
} catch (IORuntimeException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 在D盘logs文件夹下生成一个txt文件
*/
public void createdTxtFile(){
try {
// 保存路径
String path = "D://logs";
String title = "a";
String content = "一段话";
// 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw
/* 写入Txt文件 */
File mkdirsName = new File(path);// 相对路径,如果没有则要建立一个新的output。txt文件
if(!mkdirsName.exists()){
mkdirsName.mkdirs();
}
File writename = new File(path+"\\"+title+".txt");// 相对路径,如果没有则要建立一个新的output。txt文件
// 判断文件是否存在,不存在即新建
// 存在即根据操作系统添加换行符
if(!writename.exists()) {
writename.createNewFile(); // 创建新文件
} else {
String osName = System.getProperties().getProperty("os.name");
if (osName.equals("Linux")) {
content = "\r" + content;
} else {
content = "\r\n" + content;
}
}
// 如果是在原有基础上写入则append属性为true,默认为false
BufferedWriter out = new BufferedWriter(new FileWriter(writename,true));
out.write(content); // 写入TXT
out.flush(); // 把缓存区内容压入文件
out.close(); // 最后记得关闭文件
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将文件转为byte数组
*
* @param filename
* @return byte[]
*/
public static byte[] file2ByteArray(String filename) throws IOException {
FileChannel fc = null;
try {
fc = new RandomAccessFile(filename, "r").getChannel();
MappedByteBuffer byteBuffer = fc.map(FileChannel.MapMode.READ_ONLY, 0,
fc.size()).load();
byte[] result = new byte[(int) fc.size()];
if (byteBuffer.remaining() > 0) {
byteBuffer.get(result, 0, byteBuffer.remaining());
}
return result;
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
try {
fc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
此文章重点在于如何使用一个ajax异步请求下载文件,并非一定为zip文件,生成zip文件只是作用于展示下载的流程,代码未做验证,因为绝大部分实际业务中的文件可以自己生成,只需要将生成的文件转为对应的byte数组,然后按照要求返回给前端即可,前端使用ajax请求即可下载此文件。
更多推荐
通过ajax异步请求下载文件的方法
发布评论