【问题标题】:handling file download from api call处理来自 api 调用的文件下载
【发布时间】:2021-03-01 23:29:48
【问题描述】:

在反应中,我正在根据this post中提到的 John Culviner 的解决方案测试我的文件下载

axios.post('api/downloadMyFile', 
            data
           ).then((response) => {
            
             const url = window.URL.createObjectURL(new Blob([response.data])) 

             const a = document.createElement('a');

             a.href = url;
             a.download = "test.zip"  
             document.body.appendChild(a);
             a.click();
             window.URL.revokeObjectURL(url);


           
        }).catch((err) => {
            
        } 

所以文件test.zip 正在下载。但是当我在保存后尝试打开它时,我在 Windows 中收到 Compressed Zip 文件夹错误。

另外,我注意到我不需要在a.download = "test.zip" 行中指定文件的名称,因为 Web 服务正在从共享存储中获取文件并且它已经有了一个名称。 所以在这种情况下,我是否需要在 response 对象中也有文件名? response.filename 之类的东西,这样我就可以在下面的行中使用它,而不是手动命名它:

a.download = response.filename

【问题讨论】:

  • 你让我们假设通过 axios 检索到的文件是一个有效的 zip 文件。看起来确实如此。
  • 是的,我不知道它为什么抱怨。
  • 哎呀 - 我的意思是它似乎通过 axios 检索到的 zip 文件是有效的。
  • 嗯。我的方法有什么问题吗?

标签: javascript reactjs


【解决方案1】:

Axios 返回的response.data 是一个 JSON 字符串。因此,从该 JSON 创建 Blob 不会产生正确的对象。来自 Axios 文档:

// responseType 表示服务器将要发送的数据类型 回复
// 选项有:'arraybuffer'、'document'、'json'、 '文本','流'
// 仅限浏览器:'blob'
响应类型:'json', // 默认

简单的解决方法是告诉 Axios 以Blob 的形式提供响应。然后URL.createObjectURL() 将生成一个指向正确格式文件的 URL。

axios.post('api/downloadMyFile', data, { responseType: 'blob' })
.then(blob=>{
  const url = window.URL.createObjectURL(blob.data); 
  const a = document.createElement('a');
  a.href = url;
  a.download = "download.zip"  
  document.body.appendChild(a);
  a.click();
  window.URL.revokeObjectURL(url);
})

【讨论】:

  • 谢谢兰迪。这样做有效,但我的响应对象不再显示在控制台日志中,这样做console.log(blob); 向我展示了这一点。 i.stack.imgur.com/uqABh.png 。所以我无法使用响应对象返回的信息。
  • 您可以使用您创建的网址。例如,如果它是您评论中的图像,则 img.src 等于 URL。图像将出现。
  • 对不起,我没听懂。最初,response.data 显示类似NOT AUTHORIZED 的信息,如果有人无权下载该文件。但是由于我们已经告诉 axios 以 blob 的形式提供信息,所以它的显示如上图所示。
  • 我的意思是在 blob 转换 Object { data: "NOT_AUTHORIZED: you are not allowed to download this file", status: 200, statusText: "", headers: {…}, config: {…}, request: XMLHttpRequest } 之前它是这样显示的。 Blob 转换后,它只显示如上图所示
  • 那是一个不同的问题,我已经回答了你原来的问题。你应该把它作为一个新问题发布。否则,会发生什么是这些问题/答案继续永远延伸。在您的新问题中,您应该准备好被告知您的服务器不应该返回 200 的 HTTP 状态代码,而它应该是 401 或 403。祝您好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 2018-08-12
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多