当前位置: 首页 > 知识库问答 >
问题:

当responseType是使用Vuejs的blob时,如何处理错误?

公良玺
2023-03-14

我的问题与此类似,没有答案。我试着搜索其他很多地方,但仍然没有答案。

return new Promise((resolve, reject) => {
      Axios.get(`${fileDownloadUrl}`,
        { responseType: 'blob' } // Blob doesn't handle errors
      ).then(response => {
        let byteData = response.data
        var blob = new Blob([byteData], {type: response.headers['content-type']})
        let fileName = _.split(response.headers['content-disposition'], '=')
        FileSaver.saveAs(blob, fileName[1])
        resolve(fileName[1])
      },
        error => {
          console.log(error.response.data) // returns Blob - error message from service is not handled
          reject(error.response.data)
        }
      )

我从上面的代码中删除了{响应类型:'blob'},然后再试一次,我现在得到了错误消息,但是下载的文件没有任何内容,它是一个空白数据。

如何下载文件并处理服务返回的错误响应?

共有2个答案

姬慎之
2023-03-14
import axios from "axios";

// It is needed to handle when your response is not Blob (for example when response is json format)
axios.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        if (
            error.request.responseType === 'blob' &&
            error.response.data instanceof Blob &&
            error.response.data.type &&
            error.response.data.type.toLowerCase().indexOf('json') != -1
        ) {
            return new Promise((resolve, reject) => {
                let reader = new FileReader();
                reader.onload = () => {
                    error.response.data = JSON.parse(reader.result);
                    resolve(Promise.reject(error));
                };

                reader.onerror = () => {
                    reject(error);
                };

                reader.readAsText(error.response.data);
            });
        }
        return Promise.reject(error);
    }
);


// Now you can get response in both Blob and json format
axios.get(
    url,
    {
        responseType: 'blob'
    }
).then(response => {
    // Your Code

}).catch((error) => {
    // Your Code
    // You can get error in json format
});
艾跃
2023-03-14

使用vue资源解决了这个问题。虽然它将在未来的版本中退役,但我找不到更好的方法来做这件事,因为Axios无法处理它。

代码如下:

main.js

import VueResource from 'vue-resource'
Vue.use(VueResource)

服务js

return new Promise((resolve, reject) => {
  VueResource.http.get(`${fileDownloadUrl}`,
    { responseType: 'blob' }
  ).then(response => {
    methods.downloadFile(response, cid)
    resolve(cid)
  }, error => {
    reject(error)
  })
})

希望这能有所帮助。

 类似资料:
  • 我在VueJS应用程序中使用带有Axios的blob responseType从服务器下载文档。当响应代码为200时,它可以正常工作并下载文件,但当出现任何http错误时,我无法在捕获错误时读取状态代码,因为错误是JSON响应。 是否有人遇到过类似的问题,并找到了将blob响应类型转换为json并根据状态代码抛出错误的方法 我曾尝试从Laravel后端以纯文本形式发送响应,并尝试在前端将响应转换为

  • 我使用的是Netty 4.0.33-Final中的LengthFieldBasedFrameDecoder类。 我正在开发的软件可以在没有Netty的帮助下与电视通信,所以我在这里以非传统的方式使用Netty。我只是使用Netty作为解码器和通道管道来解码来自各种不同设备的消息。那至少是我的目标。 问题是LengthFieldBasedFrameDecoder将长度字段解释为十六进制值0x38,并

  • 我对vue.js非常陌生,现在我正在尝试使用https://ly525.github.io/material-vue-daterange-picker/guide.html#Introduction中的vue.js datepicker 但是当我导入要使用的脚本时,我会得到这样的消息 “VMDDateRangePicker”已声明,但其值从未读取。TS(6133)找不到模块“v-md-date-r

  • 通过对错误类型实现 Display 和 From,我们能够利用上绝大部分标准库错误处理工具。然而,我们遗漏了一个功能:轻松 Box 我们错误类型的能力。 标准库会自动通过 Form 将任意实现了 Error trait 的类型转换成 trait 对象 Box<Error> 的类型(原文:The std library automatically converts any type that imp

  • 由于每个实体都有BLOB字段,我的Java应用程序变得非常慢。该字段通常用于存储PDF文件,每当我必须列出所有对象时,都需要相当长的时间,直到持久性提供程序可以完成其工作。我寻找有关如何处理此类数据的答案,但其中一些人谈到将BLOB存储在单独的表中,然后使用FetchType.LAZY.是否有任何方法仅在需要时获取此字段而无需创建另一个表?如果没有,创建另一个表是最合适的解决方案吗? 实体代码 导

  • 我有一个Axios请求下载。xls文件。问题是,作为后端响应返回的对象并不总是必须是真实的文件。如果我返回json对象而不是文件数据。那么我将如何阅读这个json呢? 以下是函数: 我想阅读响应,如果其中包含一些数据-不要创建blob并启动下载,而是显示一些消息或其他内容。如果我删除responseType:'blob',则。xls文件下载为不可读且无效的文件。 因此,问题是每个返回的响应都变成B