axios下载文件,带有原始正确的扩展名
Axios download file with original right extension
我有以下下载文件的 vuex 方法:
downloadFile(context, url) {
return new promise((resolve, reject) => {
const method = "GET";
axios
.request({
url: url,
method,
responseType: "blob"
})
.then(response => {
let fileURL = window.URL.createObjectURL(
new Blob([response.data]),
{
type: response.headers["content-type"]
}
);
let fileLink = document.createElement("a");
fileLink.href = fileURL;
let fileName = response.headers["content-disposition"].split(
"filename="
)[1];
fileLink.setAttribute("download", fileName);
document.body.appendChild(fileLink);
fileLink.click();
fileLink.remove();
resolve();
})
.catch(() => {
reject();
});
});
}
我通过了URLlink(来自laravelAPI)
Blockquote
下载的文件总是扩展名为txt的问题
Blockquote
有什么方法可以获取文件扩展名?
如果您的端点不提供扩展名,您可以在 fileName
中添加它。所以它可能是:
- fileLink.setAttribute("download", fileName);
+ const extention = 'pdf'; // example
+ fileLink.setAttribute("download", `${fileName}.${extention}`);
您的服务器没有发送截图中的文件扩展名。如果它不在 downloadFile
的 url
参数中并且您无法修复服务器响应以包含它,您可以从 Content-Type
中推断出它。您可以创建一个散列,将每个内容类型链接到一个扩展。
删除这个:
let fileName = response.headers["content-disposition"].split(
"filename="
)[1];
用这个替换它以捕获扩展名:
const extensions = {
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
'application/fake': 'fake', // Just an example
// etc. Add another line for every Content-Type
}
const contentType = response.headers["Content-Type"];
const extension = extensions[contentType];
const filename = 'file.' + extension;
这会将每个文件命名为 "file."
我有以下下载文件的 vuex 方法:
downloadFile(context, url) {
return new promise((resolve, reject) => {
const method = "GET";
axios
.request({
url: url,
method,
responseType: "blob"
})
.then(response => {
let fileURL = window.URL.createObjectURL(
new Blob([response.data]),
{
type: response.headers["content-type"]
}
);
let fileLink = document.createElement("a");
fileLink.href = fileURL;
let fileName = response.headers["content-disposition"].split(
"filename="
)[1];
fileLink.setAttribute("download", fileName);
document.body.appendChild(fileLink);
fileLink.click();
fileLink.remove();
resolve();
})
.catch(() => {
reject();
});
});
}
我通过了URLlink(来自laravelAPI)
Blockquote
下载的文件总是扩展名为txt的问题
Blockquote
有什么方法可以获取文件扩展名?
如果您的端点不提供扩展名,您可以在 fileName
中添加它。所以它可能是:
- fileLink.setAttribute("download", fileName);
+ const extention = 'pdf'; // example
+ fileLink.setAttribute("download", `${fileName}.${extention}`);
您的服务器没有发送截图中的文件扩展名。如果它不在 downloadFile
的 url
参数中并且您无法修复服务器响应以包含它,您可以从 Content-Type
中推断出它。您可以创建一个散列,将每个内容类型链接到一个扩展。
删除这个:
let fileName = response.headers["content-disposition"].split(
"filename="
)[1];
用这个替换它以捕获扩展名:
const extensions = {
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
'application/fake': 'fake', // Just an example
// etc. Add another line for every Content-Type
}
const contentType = response.headers["Content-Type"];
const extension = extensions[contentType];
const filename = 'file.' + extension;
这会将每个文件命名为 "file.