StreamSaver实现大文件下载解决方案

StreamSaver实现大文件下载解决方案

web端

  1. 安装 StreamSaver.js
npm install streamsaver
# 或
yarn add streamsaver
  1. 在 Vue 组件中导入
import streamSaver from "streamsaver"; // 确保导入名称正确
  1. 完整代码修正
<!--
  * @projectName: 
  * @desc: 
  * @author: duanfanchao
  * @date: 2024/06/20 10:00:00
-->
<template>
	<div class="async-table">
		<button @click="downloadLargeFile">下载大文件(带进度)</button>
		<div v-if="progress > 0">下载进度: {
   
   {
   
    progress }}%</div>
	</div>
</template>

<script>
import streamSaver from "streamsaver";

export default {
   
   
	name: "AsyncTable",
	components: {
   
   },
	data() {
   
   
		return {
   
   
			progress: 0,
		};
	},
	methods: {
   
   
		async downloadLargeFile() {
   
   
			try {
   
   
				const fileUrl = "../系统架构师资料.zip"; // 替换为你的大文件URL
				const fileName = "largeFile.zip"; // 下载后的文件名

				// 使用 fetch 获取文件流
				const response = await fetch(fileUrl);
				if (!response.ok) throw new Error("下载失败");

				const contentLength = +response.headers.get("content-length");
				let downloadedBytes = 0;

				const fileStream = streamSaver.createWriteStream(fileName);
				const reader = response.body.getReader();
				const writer = fileStream.getWriter();

				const updateProgress = (chunk) => {
   
   
					downloadedBytes += chunk.length;
					this.progress = Math.round(
						(downloadedBytes / contentLength) * 100
					);
                    console.log('updateProgress', this.progress);
				};

				const pump = async () => {
   
   
					const {
   
    done, value } = await reader.read();
					if (done) {
   
   
						await writer.close();
						return;
					}
					updateProgress(value);
					await writer.write(value);
					return pump();
				};
				await pump();

				console.log("下载完成!");
			} catch (error) {
   
   
				console.error("下载出错:", error);
			}
		},
	},
	mounted() {
   
   },
};
</script>

<style lang="less" scoped>
.async-table {
   
   
    height: 100%;
	width: 100%;
}
</style>

注意

  • StreamSaver.js 依赖 Service W
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值