使用streamsaver+fetch下载文件

编程入门 行业动态 更新时间:2024-10-27 10:32:21

问题

之前使用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的替代者。这里主要就是文件流下载并保存到本地。

参考:

  • StreamSaver.js
  • Piping a fetch response to StreamSaver

更多推荐

使用streamsaver+fetch下载文件

本文发布于:2023-06-13 17:44:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1386899.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:文件   streamsaver   fetch

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!