let aLink = document.createElement('a')
aLink.href = `xxxx下载地址`// 设置下载的图片链接
aLink.click()// 触发点击事件
**
**
window.location对象获取当前页面的地址信息,如果项目上线地址肯定不可以写死吧
window.open(
window.location.origin +
'xxxxxxxxxx' +
params,
'_self'
)
var xhr = new XMLHttpRequest();
let url = 'xxxxx'
xhr.open("get", url, true);
//加请求头
let userId = JSON.parse(getStore('user')).userId
xhr.setRequestHeader("user",userId);
xhr.responseType = "blob"; // 返回类型blob blob 存储着大量的二进制数据
xhr.onload = function () {
if (this.status === 200) {
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob); // 转换为base64,可以直接放入a标签href
reader.onload = function (e) {
var a = document.createElement("a"); // 转换完成,创建一个a标签用于下载
a.download = 'xxx';//名字
a.href = e.target.result;
a.click();
};
}
};
xhr.send(); // 发送ajax请求
base64 blob
base64是二进制数据的一个编码格式,就像utf8一样的东西,他跟json一样,也是前后端交互能够相互识别的数据,他更多的是用来传递文件数据
文件的数据类型是blob
Blob对象
一个Blob对象就是一个包含有只读原始数据的类文件对象。Blob对象可以看做是存放二进制数据的容器。
FileReader
使用FileReader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容。
**
图片在后端的存储方式有哪些?
**
答:
一般来说,图片在后端的存储方式分为两种
(1)可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中;
(2)将图片转换成二进制流,直接存储到数据库的 Image 类型字段中.
对于第一种存储方式,我们前端直接将存储路径赋值给 src 属性即可轻松显示。
对于第二种存储方式,我们前端需要将其二进制流交由 blob 对象处理,然后通过 blob 的 API 生成临时 URL 赋值给 src 属性来显示。
Header中的请求参数:Content-Type、Content-Dispositon
Content-Dispositon: 控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。
具体介绍:Content-Disposition - HTTP | MDN (mozilla.org)
Content-Type:使用Content-Type来表示具体请求or响应中的媒体类型信息
常见的媒体格式类型如下:
…
项目中一般会统一使用封装的axios进行请求,而且会存在一些校验,所以上面的方法其实不太合适
利用响应拦截,如果响应媒体类型为’application/octet-stream’ …,从dispotion中取出name,利用a链接进行下载。。
ins.interceptors.response.use(res => {
const data = res.data
if (res.config.url.includes('/download')) {
if (data.type === 'application/octet-stream' || data.type === 'text/xml' || data.type === 'text/plain') {
let disposition = decodeURI(res.headers['content-disposition'])
let name = disposition.split(';')[1]
let a = document.createElement('a')
a.download = name.match(/"(\S*)"/)[1]
a.href = window.URL.createObjectURL(data)
a.click()
}
}
})
async download () {
let res = await xxx接口({
参数
})
if (res.type === 'application/json') {
var reader = new FileReader()
reader.onload = e => {
let json = JSON.parse(e.target.result)
if (json.status_code === 1 && json.msg) {
this.$message({
type: 'error',
message: json.msg
})
}
}
reader.readAsText(res)
}
}
<input
type="file"
@change="changeFunction"
/>
data(){
return{
changeFunction: (event) => {
let file = event.target.files[0];
if (!file) return false;
let FileName = file.name;
...
//把上传的文件存到data里
this.$set(this.addFileForm, "file", file);
this.$set(this.addFileForm, "file_name_origin", file.name);
},
}
}