blob对象实现文件下载


前言

有时候公司或者我们自己想要通过文件流的形式下载文件,或者我们想将某些数据以某种文件格式下载下来。blob是个不错的选择。 基本上所有的文件都能生成。

a标签download属性(可以下载同域名下的文件)

向下面第一个a标签是一个网址,因为和本地服务不同源,是跨域的,是不会直接下载图片的,同域名下的可以使用这种方式

  <!-- 下载图片--a标签download下载 -->
  <!-- 跨域的 -->
  <a download href="https://img2.baidu.com/it/u=579752663,2659622847&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=1056">下载图片</a>
  <!-- 不跨域的,同域名下的可以使用这种方式 -->
  <a download href="./img/lufei.png">下载当前页面本服务器图片</a>

用liveserver启动一个本地服务,然后可以使用download下载本地服务器同域名下的图片
在这里插入图片描述
在这里插入图片描述

下载不同源文件

Blob对象

Blob 对象表示一个二进制文件的数据内容,比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件,它的名字是 Binary Large Object (二进制大型对象)的缩写。它与 ArrayBuffer 的区别在于,它用于操作二进制文件,而 ArrayBuffer 用于操作内存。

Blob对象使用场景
  • 分片上传
  • 从互联网下载数据
  • Blob用作URL
  • Blob 转换为Base64
  • 图片压缩
  • Blob与ArrayBuffer的区别
在js封装一个下载文件的函数
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>下载文件</title>
</head>
<body>
  <!-- 下载图片--a标签download下载 -->
  <!-- 跨域的 -->
  <a download href="https://img2.baidu.com/it/u=579752663,2659622847&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=1056">下载图片</a>
  <!-- 不跨域的 -->
  <a download href="./img/lufei.png">下载当前页面本服务器图片</a>
  <script>
    /**
     *  download 函数下载互联网文件
    */
    function download(url){
      const xhr=new XMLHttpRequest()
      xhr.open('GET',url)
      // GET请求,url地址
      xhr.responseType='blob'
      // 响应类型设置为blob
      xhr.send()
      // 发送请求
      xhr.onload=function(){
        // 是否加载完毕
        const fileBlob=xhr.response;
        console.log(fileBlob)
        // xhr.response返回的数据
        const fileUrl=URL.createObjectURL(fileBlob)
        // 将fileBlob转换成url地址
        console.log(fileUrl)
        const elementA=document.createElement('a')
        // 创建一个a标签
        elementA.setAttribute('href',fileUrl)
        // 设置a标签属性 ,href属性名,fileUrl属性值
        elementA.innerText='下载'
        elementA.setAttribute('download','')
        // 设置a标签download属性
        document.body.appendChild(elementA)
        // 添加到body里面
      }
    }
    let imgUrl='https://img2.baidu.com/it/u=579752663,2659622847&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=1056'
    download(imgUrl)
    // 调用一下
  </script>
</body>
</html>
  </script>
xhr.responseType

AJAX 请求时,如果指定responseType属性为blob,下载下来的就是一个 Blob 对象。

生成url

生成 URL
浏览器允许使用URL.createObjectURL()方法,针对 Blob 对象生成一个临时 URL,以便于某些 API 使用。这个 URL 以blob://开头,表明对应一个 Blob 对象,协议头后面是一个识别符,用来唯一对应内存里面的 Blob 对象。这一点与data://URL(URL 包含实际数据)和file://URL(本地文件系统里面的文件)都不一样。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
后续的函数触发可以自己添加事件触发

分享一个我在工作项目中的使用

封装的downloadBlob 方法

 // 文件下载封装
    /**
     * fileId用户调下去文件接口
     * flieName 文件名 自定义
     */
    downloadHandle(fileId, flieName) {
      // this.loading = true
      this.$axios({
        url: `/attachment/download/${fileId}`,
        responseType: 'blob',
      })
        .then((res) => {
          // console.log(res.data)[{ ize: 11235, type: 'image/png' }]
          let url = window.URL.createObjectURL(res.data)
          let a = document.createElement('a')
          a.style.display = 'none'
          a.href = url
          a.setAttribute('download', flieName)
          document.body.appendChild(a)
          a.click() //执行下载
          window.URL.revokeObjectURL(a.href)
          document.body.removeChild(a)
        })
        .finally(() => (this.loading = false))
    },
}

组件中一个小组件

      <el-button
                      title="点击下载"
                      type="text"
                      style="
                        word-break: break-all;
                        white-space: normal;
                        line-height: 1;
                        text-align: left;
                      "
                      @click="clhqmzdown()"
                    >
                      {{ '点击下载处理后签名照' }}
           </el-button>

组件调用

    clhqmzdown() {
      console.log(this.clqmzid)
      this.downloadHandle(this.clqmzid, this.username + '处理后签名照')
    },

总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!
👨‍🔧 个人主页 : 前端初见。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Vue中进行文件下载主要有两种方式:URL下载和Blob下载。 URL下载是最简单的方法,只需将文件的URL传递给浏览器即可,浏览器会自动下载文件。在Vue中,可以使用`window.open(url)`或者`window.location.href = url`来实现URL下载。但这种方法只适用于服务器直接提供下载链接的情况。 而Blob下载则适合于需要在客户端动态生成文件并下载的情况。Blob是二进制数据的一种表示形式,可以用于生成文件对象。首先,需要使用`axios`或`fetch`等工具从后端获取数据。然后,创建一个Blob对象并填充数据。最后,创建一个URL对象,并将其赋给一个a标签的href属性,并添加download属性指定下载文件的名称,最后调用click()方法点击该a标签即可开始下载。 举个例子,假设我们从后端获取到了一个文件的二进制数据data,并且文件名为filename。可以通过以下代码实现Blob下载: ```javascript import axios from 'axios'; export default { methods: { downloadFile() { axios.get('/api/download') .then(response => { const data = response.data; const blob = new Blob([data]); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'filename'); link.click(); window.URL.revokeObjectURL(url); }) .catch(error => { console.error(error); }); } } } ``` 在以上代码中,首先使用axios发送GET请求获取文件数据。然后,通过`new Blob([data])`创建Blob对象。接着,通过`window.URL.createObjectURL(blob)`创建一个URL对象。然后,使用createElement方法创建一个a标签,并将URL对象赋给href属性和设置download属性,最后调用click()方法触发文件下载。最后,记得使用`window.URL.revokeObjectURL(url)`释放URL对象以节省内存。 通过以上的代码,我们就可以实现在Vue中进行Blob下载了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端初见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值