vue进行下载与处理二进制流文件的方法详解

 更新时间:2023年12月15日 11:10:40   作者:UserGuan  
这篇文章主要为大家详细介绍了vue如何实现将后端返回的二进制流进行处理并实现下载,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

什么是二进制流文件

二进制文件是一种计算机文件格式,它的数据以二进制形式存储,与文本文件不同。二进制文件可以包含任意类型的数据,例如图像、音频、视频、可执行文件、压缩文件等,而文本文件则仅仅包含 ASCII 码或其他编码的字符数据。

二进制文件的底层原理是将数据以二进制形式存储在文件中。在计算机中,所有的数据都是以二进制形式表示的,包括数字、字符、图像、音频、视频等。二进制文件通过按照特定的格式将这些二进制数据存储在文件中,以便在需要时能够正确地读取和使用。

二进制流常见的 Blob、ArrayBuffer、File、FileReader 和 FormData

二进制流长啥样?如下图:

获取二进制流文件的方法

/** 获取二进制流文件
 * @param url 请求地址
 * @param params 请求参数
 * @param method 请求方式,默认:'POST'
 * @param configType 设置响应类型
 * 'arraybuffer':设置响应类型为二进制对象(返回的是一个包含二进制数据的 JavaScript ArrayBuffer 类型化数组)
 * 'blob':设置响应类型为二进制对象(返回的是一个包含二进制数据的 Blob 对象)
 * @returns {Promise<void>} 请求结果
 */
async getBinaryFile(url, params, method = 'POST', configType = 'arraybuffer') {
  const headConfig = {
    responseType: configType // 设置响应类型
  }
  let res = {} // 请求结果
  switch (method.toLowerCase()) {
    case 'get':
      res = await axios.get(url, { params, ...headConfig }) // get 请求方式
      break
    case 'post':
      res = await axios.post(url, params, { ...headConfig }) // post 请求方式
      break
  }
  this.downloadBinaryFile(res.data, '项目介绍.txt') // 下载二进制文件
},

下载二进制流文件的方法

/** 下载二进制流文件
 * @param binFile 二进制文件流
 * @param fileName 文件名,例如:测试文本.txt
 * @param blobType Blob 对象的 type 属性给出文件的 MIME 类型,默认:'application/octet-stream'(用于通用二进制数据)
 */
downloadBinaryFile(binFile, fileName, blobType = 'application/octet-stream') {
  // 处理二进制数据并创建 Blob 对象
  const blobObj = new Blob([binFile], { type: blobType })
  // 创建一个链接并设置下载属性
  const downloadLink = document.createElement('a')
  let url = window.URL || window.webkitURL || window.moxURL // 兼容不同浏览器的 URL 对象
  url = url.createObjectURL(blobObj)
  downloadLink.href = url
  downloadLink.download = fileName // 设置下载的文件名
  // 将链接添加到 DOM 中,模拟点击
  document.body.appendChild(downloadLink)
  downloadLink.click()
  // 移除创建的链接和释放 URL 对象
  document.body.removeChild(downloadLink)
  window.URL.revokeObjectURL(url)
}

完整代码

在 Vue.js 中,可以通过使用 axios 或其他类似的 HTTP 库从后端获取二进制数据,并通过前端进行处理以实现文件下载。以下是一个简单的示例,使用 axios 和 Blob 对象来处理二进制数据。

首先,确保你的 Vue 项目中已经安装了 axios 网络请求库

npm install axios

然后,在你的 Vue 组件中,可以这样处理后端返回的二进制流

<!-- 下载二进制流文件 -->
<template>
  <div>
    <button @click="getBinaryFile('YOUR_BACKEND_API_ENDPOINT', { id: '' })">下载文件</button>
  </div>
</template>
 
<script>
import axios from 'axios'
 
export default {
  methods: {
    /** 获取二进制流文件
     * @param url 请求地址
     * @param params 请求参数
     * @param method 请求方式,默认:'POST'
     * @param configType 设置响应类型
     * 'arraybuffer':设置响应类型为二进制对象(返回的是一个包含二进制数据的 JavaScript ArrayBuffer 类型化数组)
     * 'blob':设置响应类型为二进制对象(返回的是一个包含二进制数据的 Blob 对象)
     * @returns {Promise<void>} 请求结果
     */
    async getBinaryFile(url, params, method = 'POST', configType = 'arraybuffer') {
      const headConfig = {
        responseType: configType // 设置响应类型
      }
      let res = {} // 请求结果
      switch (method.toLowerCase()) {
        case 'get':
          res = await axios.get(url, { params, ...headConfig }) // get 请求方式
          break
        case 'post':
          res = await axios.post(url, params, { ...headConfig }) // post 请求方式
          break
      }
      this.downloadBinaryFile(res.data, '项目介绍.txt') // 下载二进制文件
    },
    /** 下载二进制流文件
     * @param binFile 二进制文件流
     * @param fileName 文件名,例如:测试文本.txt
     * @param blobType Blob 对象的 type 属性给出文件的 MIME 类型,默认:'application/octet-stream'(用于通用二进制数据)
     */
    downloadBinaryFile(binFile, fileName, blobType = 'application/octet-stream') {
      // 处理二进制数据并创建 Blob 对象
      const blobObj = new Blob([binFile], { type: blobType })
      // 创建一个链接并设置下载属性
      const downloadLink = document.createElement('a')
      let url = window.URL || window.webkitURL || window.moxURL // 兼容不同浏览器的 URL 对象
      url = url.createObjectURL(blobObj)
      downloadLink.href = url
      downloadLink.download = fileName // 设置下载的文件名
      // 将链接添加到 DOM 中,模拟点击
      document.body.appendChild(downloadLink)
      downloadLink.click()
      // 移除创建的链接和释放 URL 对象
      document.body.removeChild(downloadLink)
      window.URL.revokeObjectURL(url)
    }
  }
}
</script>

确保替换 `YOUR_BACKEND_API_ENDPOINT` 为你的后端API的实际地址,并设置适当的文件名。

这个例子中,我们使用了 axios 来获取后端返回的二进制数据,然后使用 Blob 对象创建一个包含该二进制数据的 Blob,最后创建一个下载链接并模拟点击以触发文件下载。

注意:浏览器的同源策略可能会限制跨域请求。如果你的前端和后端不在同一个域下,你可能需要在后端配置 CORS(跨域资源共享)来允许前端访问。

关于 Blob 的 content-type 的部分媒体类型

".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/vnd.ms-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"
 
".doc"="application/msword"
".docx"="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
".rtf"="application/rtf"
".xls"="application/vnd.ms-excel application/x-excel"
".xlsx"="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
".ppt"="application/vnd.ms-powerpoint"
".pptx"="application/vnd.openxmlformats-officedocument.presentationml.presentation"
".pps"="application/vnd.ms-powerpoint"
".ppsx"="application/vnd.openxmlformats-officedocument.presentationml.slideshow"
".pdf"="application/pdf"
".swf"="application/x-shockwave-flash"
".dll"="application/x-msdownload"
".exe"="application/octet-stream"
".msi"="application/octet-stream"
".chm"="application/octet-stream"
".cab"="application/octet-stream"
".ocx"="application/octet-stream"
".rar"="application/octet-stream"
".tar"="application/x-tar"
".tgz"="application/x-compressed"
".zip"="application/x-zip-compressed"
".z"="application/x-compress"
".wav"="audio/wav"
".wma"="audio/x-ms-wma"
".wmv"="video/x-ms-wmv"
".mp3, .mp2, .mpe, .mpeg, .mpg"="audio/mpeg"
".rm"="application/vnd.rn-realmedia"
".mid, .midi, .rmi"="audio/mid"
".bmp"="image/bmp"
".gif"="image/gif"
".png"="image/png"
".tif, .tiff"="image/tiff"
".jpe, .jpeg, .jpg"="image/jpeg"
".txt"="text/plain"
".xml"="text/xml"
".html"="text/html"
".css"="text/css"
".js"="text/javascript"
".mht, .mhtml"="message/rfc822"

关于 responseType 的值

"" - 设为空字符串与设置为 "text" 相同,默认类型

"text" - 返回的是包含在 DOMString 对象中的文本

"document" - 返回的是一个 HTML Document 或 XML XMLDocument

"arraybuffer" - 返回的是一个包含二进制数据的 JavaScript ArrayBuffer

"blob" - 返回的是一个包含二进制数据的 Blob 对象

"json" - 返回的是一个 JavaScript 对象。这个对象是通过将接收到的数据类型视为 JSON 解析得到的

"ms-stream" - 返回的是下载流的一部分;此响应类型仅允许下载请求,并且仅受 Internet Explorer 支持

到此这篇关于vue进行下载与处理二进制流文件的方法详解的文章就介绍到这了,更多相关vue二进制流文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue面试常考之computed是如何实现的

    vue面试常考之computed是如何实现的

    对于每天都在用的计算属性(computed),小编猜大家肯定也想窥探其奥妙与原理对吧,所以这篇文章就来讲讲computed是如何实现的吧,感兴趣的小伙伴可以学习一下
    2023-08-08
  • Vue 中的受控与非受控组件的实现

    Vue 中的受控与非受控组件的实现

    这篇文章主要介绍了Vue 中的受控与非受控组件的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 详解VUE2.X过滤器的使用方法

    详解VUE2.X过滤器的使用方法

    本篇文章主要介绍了详解VUE2.X过滤器的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • Vue生命周期详解

    Vue生命周期详解

    本文详细讲解了Vue的生命周期,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • vue2.0与vue3.0及vue与react的区别及说明

    vue2.0与vue3.0及vue与react的区别及说明

    这篇文章主要介绍了vue2.0与vue3.0及vue与react的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 分享一个精简的vue.js 图片lazyload插件实例

    分享一个精简的vue.js 图片lazyload插件实例

    本篇文章主要介绍了分享一个精简的vue.js 图片lazyload插件实例。非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • vue项目实战总结篇

    vue项目实战总结篇

    离放假还有1天,今天小编抽空给大家分享前端时间小编做的vue项目,非常完整,需要的朋友参考下
    2018-02-02
  • Vue中v-html图片过大导致溢出的问题及解决

    Vue中v-html图片过大导致溢出的问题及解决

    这篇文章主要介绍了Vue中v-html图片过大导致溢出的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue @input和@click的区别及说明

    vue @input和@click的区别及说明

    这篇文章主要介绍了vue @input和@click的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue-cli实现异步请求返回mock模拟数据

    vue-cli实现异步请求返回mock模拟数据

    网上有不少使用mockjs模拟数据的文章,但基本都是本地拦截请求返回数据,本文主要介绍了vue-cli实现异步请求返回mock模拟数据,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论