首页 > 其他分享 >blob转string,同步调用

blob转string,同步调用

时间:2023-05-10 12:44:33浏览次数:41  
标签:调用 const string fileType fileName window blob data

问题背景

通过接口下载文件的时候,后端设置的responseHeader

content-disposition: attachment;filename=文件名.xlsx
content-type: application/vnd.ms-excel;charset=utf-8

前端接口请求的时候,设置responseType: 'blob',后端接口直接返回的是文件流。

然后当下载文件异常的情况下,接口直接返回的“文件下载出错”的文字,这个时候业务组件内拿到的返回信息已经被转化成blob格式了,所有需要把blob转成 string,用来提示用户下载异常。

代码展示

请求响应拦截处理

获取文件流、文件名、文件后缀信息

// content-disposition: attachment;filename=文件名.xlsx
const contentDisposition = response.headers['content-disposition']

const _fileName = contentDisposition.split('=')[1]

const fileType = _fileName.substring(_fileName.lastIndexOf('.')); // .xlsx
const fileName = _fileName.substring(0, _fileName.lastIndexOf('.')); // 文件名

if (fileName && fileType) {
  return {
    data: response.data,
    fileName,
    fileType
  }
}

定义工具函数

因为把blob转成string需要用 FileReader去读取,FileReader 是异步的,所以这里需要用Promise返回,方便业务组件同步调用

export const downloadFile = (srcData, fileName='下载', fileType='.xls', target='_self') {
  var blob = new Blob([srcData])
  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    // 兼容IE/Edge
    window.navigator.msSaveOrOpenBlob(blob, fileName + fileType)
  } else {
    var url = window.URL.createObjectURL(blob)
    var a = document.createElement('a')
    a.href = url
    a.target = target
    a.style.display = 'none'
    a.setAttribute('download', fileName + fileType)
    document.body.appendChild(a)
    a.click()
    document.body.removeChild(a)
    window.URL.revokeObjectURL(url) // 释放资源
  }
}

export const blobToString = (blobData) => {
  return new Promise((resolve) => {
    if (blobData instanceof Blob) {
      const reader = new FileReader();
      reader.readAsText(blobData, 'utf-8')
      reader.onload = function () {
        resolve(reader.result || '')
      }
    } else {
      resolve('')
    }
  })
}

业务组件调用

// 省略部分代码
async down() {
  try {
    const res = await API();

    const { data, fileName, fileType, code} = res || {}
    
    if (code === -1) {
      const result = await blobToString(data)
      this.$message.error(result)
      return
    }

    downloadFile(data, fileName, fileType)
  } catch (err) {
    console.log(err)
  }
}

我是 甜点cc

公众号:【看见另一种可能】

标签:调用,const,string,fileType,fileName,window,blob,data
From: https://www.cnblogs.com/all-smile/p/17387654.html

相关文章

  • 007 python3写一个http接口服务(get, post),给别人调用
    一、python3写一个http接口服务,给别人调用3这次选择fastapi,FastAPI是一个现代的、快速(高性能)的web框架,用于基于标准Python类型提示使用Python3.6+构建api。具有快速、快速编码、更少的错误、直观、简单、简便、健壮。简易而且本地win10能够跑起来二、FastAPI的get接口代码实现......
  • C#调用C++
    一直是在写C#,最近接触到的项目中有C#调用C++接口的逻辑,自己学习了下,写个步骤日志,C#掉用C++的托管代码项目分三个项目:1、底层C++动态库项目,2、中间层的CLR项目,3、上层的C#项目1.底层C++动态库项目,1、新建一个C++动态链接库(Dll)项目,获取新建了其他的项目后在项目属性中将配置类型......
  • What does .NET's String.Normalize do?
    Whatdoes.NET'sString.Normalizedo?回答1OnedifferencebetweenformCandformDishowletterswithaccentsarerepresented:formCusesasingleletter-with-accentcodepoint,whileformDseparatesthatintoaletterandanaccent.Forinstance......
  • 【Azure 存储服务】使用 AppendBlobClient 对象实现对Blob进行追加内容操作
    问题描述在AzureBlob的官方示例中,都是对文件进行上传到Blob操作,没有实现对已创建的Blob进行追加的操作。如果想要实现对一个文件的多次追加操作,每一次写入的时候,只传入新的内容? 问题解答AzureStorageBlob有三种类型:BlockBlob,AppendBlob和PageBlob。其中,只有Appen......
  • Method com/mysql/jdbc/JDBC4ResultSet.getObject(Ljava/lang/String;Ljava/lang/Clas
      mybatis-plus生成的日期类型默认是localdatetime,数据库是datetime,按道理转换应该可以,我又不想把实体类转换成date查看依赖<--locadate/locadatetime的时间依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-ty......
  • [NISACTF 2022]string
    查壳:64位:进IDA:进来就给flag:跟进:一堆东西,秉承着赶时间的优良作风,只看有用的输出:挺简单一个随机数问题,找种子就行:上脚本:intmain(){srand(10086);for(inti=1;i<=13;i++){intv4=rand();cout<<v4%8+1;}return0;......
  • #PowerBi 一分钟学会,在excel中,调用powerbi数据模型(Analyze in Excel插件)
    在工作中,我们常常使用excel来进行临时的数据处理服务,如果我们在powerbi中,已经有了完整的数据模型。那么我们都可以通过直接调用powerbi数据模型,来进行快速的数据分析,完成任务。今天我们就介绍一下,如何在excel中调用powerbi数据模型。第一步:下载插件输入以下网址,进入sqlbi的官......
  • 统计类内成员函数调用次数(mutable 的一种用法)
    #include<iostream>classStudent{public:Student(conststd::string&name_,unsignedage_);~Student(){}voidoutput()const{std::cout<<this->name<<""<<this->age<<std::en......
  • 正则表达式和String类有关方法
    正则表达式介绍正则表达式,又被称为规则表达式(RegularExpression,在代码中常简写为regex、regexp或RE),包括普通字符(例如:a到z之间的字符等)和特殊字符(称为元字符)。正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的字符串,被广泛运用于于Scala、PHP、C#、Java、C+......
  • uniapp调用手机自带短信功能发送短信,打电话,获取本地通讯录
    1、配置(修改了manifest配置信息,要重新打包自定义基座,并卸载手机上的安装包重新运行) 2、//发短信sendMsg(phoneNumber){//#ifdefAPP-PLUSplus.messaging.TYPE_SMS;varmsg=plus.messaging.createMessage(plus.messaging.TYPE_SMS);msg.to=[phoneN......