下载
通常我们上传文件为了使得链接保持唯一性,会使用时间戳作为url的一部分,例如下面这个地址
http://fimage.oss-cn-shenzhen.aliyuncs.com/upload/file/20200729/1595992792317092560.pdf
这个地址是时间戳形式的,直接打开下载的话文件名会自动变为时间戳,那么这个时候需求就来了,相信各位上传文件,是将文件名也一起存储了的,那么就可以通过下面这种形式来下载,即转blob流的形式
//url:pdf网络地址,filename:需要下载时存在的文件名
download(url, filename) {
this.getBlob(url, (blob)=> {
this.saveAs(blob, filename);
});
},
getBlob(url, cb) {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function () {
if (xhr.status === 200) {
cb(xhr.response);
}
};
xhr.send();
},
saveAs(blob, filename) {
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, filename);
} else {
let link = document.createElement('a');
let body = document.querySelector('body');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
// fix Firefox
link.style.display = 'none';
body.appendChild(link);
link.click();
body.removeChild(link);
window.URL.revokeObjectURL(link.href);
};
}
以上可兼容各情况pdf下载
预览
pdf链接原本是可以直接打开预览的,但可能会出现一些域名上的需求,导致后端无法再配置,所以这种情况就需要前端来处理了,同样,也是转为blob流
previewPDF(url, filename) {
this.getBlob(url, (blob)=> {
this.previewAS(blob, filename);
});
},
getBlob(url, cb) {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = function () {
if (xhr.status === 200) {
cb(xhr.response);
}
};
xhr.send();
},
previewAS(blob, filename){
blob = new Blob([blob], {
type: 'application/pdf;chartset=UTF-8'
})
let fileURL = URL.createObjectURL(blob)
window.open(fileURL)
},