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

Vue。js Axios responseType blob或json对象

公西博实
2023-03-14

我有一个Axios请求下载。xls文件。问题是,作为后端响应返回的对象并不总是必须是真实的文件。如果我返回json对象而不是文件数据。那么我将如何阅读这个json呢?

以下是函数:

downloadReport() {
  let postConfig = {
    headers: {
      'X-Requested-With': 'XMLHttpRequest'
    },
    responseType: 'blob',
  } as AxiosRequestConfig

  axios
  .post(this.urls.exportDiscountReport, this.discount.id, postConfig)
  .then((response) => {
    let blob = new Blob([response.data], { type: 'application/vnd.ms-excel' });
    let url = window['URL'].createObjectURL(blob);
    let a = document.createElement('a');
    a.href = url;
    a.download = this.discount.id + ' discount draft.xlsx';
    a.click();
    window['URL'].revokeObjectURL(url);
  })
  .catch(error => {
  })
}

我想阅读响应,如果其中包含一些数据-不要创建blob并启动下载,而是显示一些消息或其他内容。如果我删除responseType:'blob',则。xls文件下载为不可读且无效的文件。

因此,问题是每个返回的响应都变成Blob类型,我在其中看不到返回的数据。有什么想法吗?

共有2个答案

蓟捷
2023-03-14

您是否尝试过检查响应Blob.type属性?它给出返回数据的MIME类型。

例如,你可以有这样的东西:

const jsonMimeType = 'application/json';
const dataType = responseBlob.type;

// The instanceof Blob check here is redundant, however it's worth making sure
const isBlob = responseBlob instanceof Blob && dataType !== jsonMimeType;

if (isBlob) {

  // do your blob download handling

} else {
  responseBlob.text().then(text => {
    const res = JSON.parse(text);
    // do your JSON handling
  });
}

我发现这更简单,对我有效,但它取决于您的后端设置。BLOB响应仍然是文本响应,但处理方式略有不同。

傅越
2023-03-14

我通过读取blob响应并检查它是否具有JSON参数状态来解决这个问题。但在我看来,这似乎是一个过度工程。有更好的解决办法吗?

let postConfig = {
  headers: {
    'X-Requested-With': 'XMLHttpRequest'
  },
  responseType: 'blob',
} as AxiosRequestConfig

axios
  .post(this.urls.exportDiscountReport, this.discount.id, postConfig)
  .then((responseBlob) => {
    const self = this;
    let reader = new FileReader();

    reader.onload = function() {
      let response = { status: true, message: '' };

      try {
        response = JSON.parse(<string>reader.result);
      } catch (e) {}

      if (response.status) {
        let blob = new Blob([responseBlob.data], { type: 'application/vnd.ms-excel' });
        let url = window['URL'].createObjectURL(blob);
        let a = document.createElement('a');
        a.href = url;
        a.download = self.discount.id + ' discount draft.xlsx';
        a.click();
        window['URL'].revokeObjectURL(url);
      } else {
        alert(response.message)
      }
    }
    reader.readAsText(responseBlob.data);
  })
  .catch(error => {
  })

我在这里也找到了同样的解决方案:https://github.com/axios/axios/issues/815#issuecomment-340972365

看起来还是太老套了。

 类似资料:
  • 客户端在关于 JSON 数组和 JSON 对象的处理和定义方面总是令人疑惑不已。尤其是由空对象和对象数组引起的问题。本节会展示一些 Elasticsearch JSON API 常见的数据格式,还会说明如何以 PHP 的语法来表达这些数据格式。 空对象 Elasticsearch API 在几个地方使用了空对象,这会对 PHP 造成影响。不像其它的语言,PHP 没有一个简便的符号来表示空对象,而许

  • 问题内容: 我需要一个易于使用的示例库,用于将NSObjects转换为JSON并再次返回,我在网上发现了大量用于解析JSon的解析示例,但是在使用SBJSON将NSObject转换为JSON时并不过分,任何人都有不错的教程或将NSObject转换为JSON的示例代码? 问题答案: 使用,将对象转换为JSON字符串,您必须重写方法。像下面这样 .h文件, 在实施文件中, 为了从JSON字符串中获取对

  • 我想解析一些JSON,但一个键要么是字符串,要么是对象。 这是我当前的结构:https://github.com/PhillippOhlandt/pmtoapib/blob/master/CollectionItemRequest.go#L10 在这里,“Url”属性不仅可以是字符串,还可以是对象。 我开始为它创建一个自己的结构,覆盖对象案例。 但是这样字符串版本就不行了。有没有一种方法既能处理这

  • 问题内容: 我需要JSON polyfill以支持IE 7以及某些IE 8和IE 9模式。我应该选择JSON 2 还是JSON 3 ?显然,JSON 3是更现代的实现,但是例如html5please这样的网站甚至都没有提及它,并建议使用JSON 2。 问题答案: HTML5 Please已更新其JSON页面,以将 JSON 3 包括在内以用作主要的polyfill,而JSON 2则是后排替代品。

  • 问题内容: 我想使用https://raw.github.com/currencybot/open-exchange- rates/master/latest.json 提供的货币数据 作为初始测试,我已经创建了它的简化版本作为内联对象: 我想要做的就是以某种方式使用例如“ EUR”作为条件查询/ grep /过滤json对象,并使其返回一个名为“ rate”的变量,其结果为“ 0.795767”

  • 我在一个保存为记事本文件的文件中有以下简单的json 我正在尝试使用打开它 我已经尝试按照本页的建议创建绝对路径,但它也会产生值错误。有人能帮忙吗?