关于在vue中如何上传文件以及下载文件
上传文件
fileLoad() {
//利用formdata表单对象转换
//获取到选中的文件
file = document.querySelector("#file").files[0]; //拿到选择的文件
//创建formdata对象 将文件存储在formdata对象中
var formdata = new FormData();
formdata.append("file", file);
//由于我们传formdata数据会占用整个传参对象,详情请看下面axios传参方式
//但是有时候需求还需要传其他的参数怎么办呢,我们可以将其他参数继续append进formdata对象中
//例如我们额外传一个参数test,值为测试
formdata.append('test','测试')
//这样我们formdata对象中就有两个字段 一个字段file 值对应的是文件对象,一个字段test 值对应的是测试
//只要formdata传送给后端,那么文件对象和测试 这两个值都会一起携带过去传给后端,后端会有中间件或者插件,解析formdata对象中的file文件对象将其单独拿出来,其他字段也可以单独提炼出来
//其实你可以想象formdata就是一个普通存放数据的对象{file:文件对象,test:'测试'}里面有一个属性对应文件对象,一个属性对应测试。然后将这个对象传给后端。后端负责从这个对象识别文件对象并获取。当然真实formdata并不是这种结构这里只是方便理解。因为我们传文件不能使用普通的对象传过去,只能将其放在formdata对象中传过去。
const config = {
headers: { "Content-Type": "multipart/form-data" }, //跟后端约定发送的数据类型为form-data对象类型
};
//调用接口上传文件
axios({
url:'http://localhost:3030/api/reg',
method:'post',
data:formdata, //我们传formdata会占用整个传参对象
headers:config.headers
}).then(res=>{
console.log(res)
})
},
下载文件
downLoadFile(fileName){
axios({
url:'http://localhost:3030/api/download',
method:'get',
responseType: 'arraybuffer',
/*
当将responseType设置为一个指定类型时,你需要确保服务器所返回的类型和你所设置的返回值类型是兼容的。那么如果两者类型不兼容呢?恭喜你,你会发现服务器返回的数据变成了null,即使服务器返回了数据。
通俗来说,如果你resoinseType设置的是JSON,就会将后端穿过来的数据尝试转换为Json格式,如果转换不了那就会强制转换成null。
我们下载文件一般设置responseType为blob或者arraybuffer都可以,为什么呢,一般下载文件掉后台接口,一般后台返回都是二进制数据。而blob和arraybuffer都是二进制数据的一种,所以当我们设置responseType为blob时,请求到后台返回的二进制数据后就会将该二进制数据转换为blob类型的二进制数据。设置responseType为arraybuffer是一样的道理
当然如果你不安规矩来,瞎几把乱搞,比如后台穿的是一个对象类型的数据例如{name:'xq'},我们知道对象是可以转成Json的,但是如果你response不是设置的Json,而是设置的arraybuffer或者blob,那么请求到数据时就会尝试将对象类型的数据转换为arraybuffer或者blob类型的二进制数据。这很明显是转不了的,这不就乱套了嘛,所以这个时候就会直接返回一个null空数据。
*/
params:{
fileName
}
}).then(
(res) => {
console.log(res)
//使用Blob对象将后端返回的Arraybuffer格式得数据转成blob类型的数据 window.URL.createObjectURL(blob)可以把一个blob转成blobURL,用作图片显示,文件下载(不能再服务器上存储,只能在浏览器使用)
var b = new Blob([res.data], { type: 'application/vnd.ms-excel' });
// 使用URL对象将blob类型的数据生成一个在线下载的链接
var url = URL.createObjectURL(b);
// 然后我们使用a标签进行下载
var link = document.createElement('a');
// 设置导出的文件名
link.download = file.name;
link.href = url;
// 点击获取文件
link.click();
},
(err) => {
console.log(err);
}
);
}