vue使用new blob方法把后端的response文件流接受到,再打开下载,但是接收不到filename
时间: 2024-02-04 18:03:33 浏览: 91
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
如果你想在前端接收到后端返回的文件名,可以在后端设置一个响应头来指定文件名,然后在前端通过获取响应头来获取文件名。具体操作如下:
后端代码示例(Node.js):
```
const fs = require('fs');
const path = require('path');
const express = require('express');
const app = express();
app.get('/download', function(req, res) {
const filePath = path.join(__dirname, 'example.txt');
const fileName = 'example.txt';
const stat = fs.statSync(filePath);
res.setHeader('Content-Disposition', 'attachment; filename=' + fileName);
res.setHeader('Content-Type', 'application/octet-stream');
res.setHeader('Content-Length', stat.size);
const stream = fs.createReadStream(filePath);
stream.pipe(res);
});
app.listen(3000, function() {
console.log('Server is running on port 3000');
});
```
在上面的代码中,我们设置了 `Content-Disposition` 响应头来指定文件名为 example.txt。
前端代码示例(Vue.js):
```
downloadFile() {
axios({
url: 'http://localhost:3000/download',
method: 'GET',
responseType: 'blob',
}).then((response) => {
const contentDisposition = response.headers['content-disposition'];
const fileName = contentDisposition.split(';')[1].split('=')[1].replace(/"/g, '');
const blob = new Blob([response.data]);
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = fileName;
link.click();
});
},
```
在上面的代码中,我们通过 `responseType: 'blob'` 来告诉 axios,我们需要接收一个二进制流。然后,我们通过获取响应头中的 `Content-Disposition` 字段来获取文件名,并使用 `new Blob()` 方法创建一个 Blob 对象,再通过创建一个 `<a>` 标签来触发下载操作,并设置 `download` 属性为文件名。
阅读全文