前端下载文件
目录
前端下载文件
前端下载文件时,需要注意的坑
通常情况下,获取文件信息和获取这个文件本身是分开的。也就是说,你在页面上看到的文件名是一个接口拿到的,而这个接口中并不包含这个文件的内容,但会包含这个文件的id。之后在根据文件id再用另一个接口拿到这个文件的本体,这个过程没有什么不对,但会存在的问题就是,文件的本体可能并没有这个文件的文件名信息,所以你下载时需要给一个逻辑文件名(自己随便起),或者最简单的保证文件名不变的方法(我能想到的)就是直接传对象,用一个map关联
const fileMap = ref<Map<number, string>>(new Map());
const checkedFile = ref<number[]>([]); // 被选择的文件id
const getFiles = () => {
const res = await 你的获取文件的操作
for (const item of res) {
if (!item) {
return;
}
fileMap.value.set(item.file_id, item.customize_name);
... 其他操作
}
}
getFiles() // 先给map填一遍数据
const downloadFile = () => {
console.log("下载文件", checkedFile.value);
for (const item of checkedFile.value) {
if (!item) return;
const url = getYourDownloadPath() + "/" + item; // 你的获取文件内容的接口
try {
axios
.get(url, {
headers: {
Authorization: `Bearer ${token}`, // 你的token(可选)
},
responseType: "blob", // 设置响应类型为blob,之后要构建下载链接
})
.then((res) => {
// 创建下载链接 start
const blob = new Blob([res.data], { type: res.data.type });
const downloadUrl = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = downloadUrl;
link.download = fileMap.value?.get(item)!; // map查找对应
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(downloadUrl);
// 创建下载链接 end
});
} catch (e: any) {
message.openMessage(e, TYPE.ERROR);
}
}
};