使用streamsaver+fetch下载文件

问题

之前使用axios进行流处理文件下载的过程中,遇到大文件的话,axios就需要等待整个文件流都下载到内存中才会弹出浏览器的下载文件保存对话框,这种方式在下载小文件的场景没什么问题,但是遇到大文件,一方面是浏览器的下载保存对话框半天都不会响应客户,这样体验不是很好;另外一方面是受到客户端内存的限制。

解决

使用StreamSaver.js+fetch解决这个问题,fetch比axios区别在于只要响应马上就可以开始弹出浏览器下载保存对话框,并且不影响文件流下载,而axios非要等到整个文件流下完了才有响应。所以axios比较适合restful接口调用这种场景。

步骤

npm

npm install streamsaver

vue

const streamSaver = require('streamsaver');
...
const url = '/api/common/downloadFile?xxxx.srt'

      fetch(url, {
        method: 'GET',
        cache: 'no-cache',
        headers: {
          'xxxx': 'xxxx'
        }
      }).then(res => {

        const fileStream = streamSaver.createWriteStream('xxxx.srt', {
          size : res.headers.get("content-length")
        })

        const readableStream = res.body

        // more optimized
        if (window.WritableStream && readableStream.pipeTo) {
          return readableStream.pipeTo(fileStream)
              .then(() => console.log('done writing'))
        }
        window.writer = fileStream.getWriter()

        const reader = res.body.getReader()
        const pump = () => reader.read()
            .then(res => res.done
                ? window.writer.close()
                : window.writer.write(res.value).then(pump))

        pump()
      })

总结

Fetch也是原生Javascript的API,是XHR的替代者。这里主要就是文件流下载并保存到本地。

参考:

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值