后端返回下载链接,前端更改文件名

本文介绍了如何使用JavaScript的Promise和XMLHttpRequest对象实现从给定URL获取Blob对象,然后利用saveAs方法下载文件,以及使用debounce优化下载请求以防止频繁请求。
getBlob(url) {
  return new Promise(resolve => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    xhr.onload = () => {
      if (xhr.status === 200) {
        resolve(xhr.response);
      }
    };
    xhr.send();
  });
},
saveAs(blob, filename) {
  var link = document.createElement('a');
  link.href = window.URL.createObjectURL(blob);
  link.download = filename;
  link.click();
},
downLoadFile: debounce(function (row) {
  this.getBlob(row.downloadUrlPath).then(blob => {
    this.saveAs(blob, `${row.fileName}.zip`);
  });
}, 1000, {'leading': true, 'trailing': false}),

前端处理后端返回的流式文件时,通常涉及以下几种方式,具体取决于后端提供的数据格式和交互需求。以下是常见的处理方法: ### 1. 使用 `Blob` 和 `URL.createObjectURL` 实现文件下载后端以二进制流(如 `application/octet-stream`)形式返回文件内容时,前端可以通过 `Blob` 对象将其封装,并通过 `URL.createObjectURL` 创建临时链接实现文件下载。这种方式适用于 Excel、Word 等文档的导出。 示例代码如下: ```javascript async function downloadFileStream(row) { const response = await fetch('/api/download', { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'example.xlsx'; // 可从响应头提取文件名 document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); } ``` 如果后端在响应头中提供文件名信息(如 `Content-Disposition: attachment; filename="example.xlsx"`),可通过解析该字段动态设置下载文件名[^2]。 ### 2. 处理流式文本输出(如 `text/plain` 或 `application/x-ndjson`) 对于后端采用流式输出(如逐行返回结果)的情况,例如使用 `content-type: application/x-ndjson` 的接口,前端需要利用 `ReadableStream` 来实时读取响应内容。这在实现“吐字”或逐步渲染结果的场景中非常有用。 示例代码如下: ```javascript async function handleStreamResponse() { const response = await fetch('http://192.168.3.37:12345/api/generate', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ model: "Q2KL", prompt: "Why is the sky blue?", stream: true, }), }); const reader = response.body.getReader(); const decoder = new TextDecoder(); let result = ''; while (true) { const { done, value } = await reader.read(); if (done) break; result += decoder.decode(value, { stream: true }); console.log(result); // 实时输出流式内容 } } ``` 这种方式可以避免等待整个响应完成后再进行处理,从而提升用户体验[^3]。 ### 3. 使用 Axios 或 Fetch 接收文件流并触发下载 在实际开发中,常使用 Axios 或原生 `fetch` 发送请求并接收文件流。此时应将 `responseType` 设置为 `'blob'`,以便正确处理二进制数据。随后创建 `<a>` 标签并模拟点击事件来触发下载行为[^4]。 ### 4. 动态获取文件名后端在响应头中提供了文件名信息(如 `Content-Disposition` 字段),可通过正则表达式提取该信息用于下载文件命名。例如: ```javascript function getFileNameFromContentDisposition(header) { const disposition = header; const fileNameRegex = /filename[*]?=([^;]+)/; const matches = disposition.match(fileNameRegex); if (matches && matches[1]) { return decodeURIComponent(matches[1].replace(/UTF-8''/i, '')); } return 'default-filename'; } ``` ### 5. 处理大文件传输 对于较大文件的传输,建议启用分块加载机制,结合服务端的断点续传支持,确保在网络不稳定时仍能可靠地完成文件传输。前端可通过监听 `progress` 事件来展示下载进度条,提高用户感知体验。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值