远程 URL 文件批量下载打包的方法

2020-04-23 18:53:12 +08:00
 DavidNineRoc

开始

解决方法:


前提

想法很好,并且已经有人这样做了,我们只用考虑按照别人的做法坐下去 前端打包有两个前提:

  1. 跨域问题,需要运维在OSS或者下载的资源服务器设置允许跨域
  2. CDN问题,让运维配置一个新域名不要走CDN(如没使用CDN可忽略)

步骤

// 引入文件
<script type="text/javascript" src="/xxx/jszip.min.js"></script>
<script type="text/javascript" src="/xxx/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="/xxx/jszip-utils-ie.min.js"></script>
<![endif]-->
<script>
let total = 0;
let progress = 0;

// 可通过按钮或者其它事件触发
$.get('/urls', function(res) {

	// 假设 res.data 是后端返回的一组远程数据对象
	// {url: 'x.jpg', filename: 'xx.jpg', path: 'xxxx'}
	
	total = res.data.length;
	if (total === 0) {
		console.error('图集无图片可下载');
		return;
	}
	
	let zip = new JSZip();
	// map 存储 folder 对象
	let folderMap = {};
	// 遍历所有后端返回的 urls
	res.data.map(function (data) {

		// 获取远程资源数据
		JSZipUtils.getBinaryContent(
			data.url,
			function (err, binData) {

				++ progress;

				if (err && progress < total) {
					console.log(err);
					return;
				}
				
				// 第一次实例化 folder 对象
				if (! folderMap[data.path]) {
					folderMap[data.path] = zip.folder(data.path);
				}

				let pf = folderMap[data.path];
				// 第三个参数必须设置,否则下载的文件将产生错误
				pf.file(data.filename, binData, {binary: true});

				if (progress === total) {

					console.log('请稍等,数据打包中');
					zip.generateAsync({type:"blob"}).then(function(content) {
						
						// 下载文件
						const link = document.createElement('a');
						link.href = window.URL.createObjectURL(content);
						link.download = 'data.zip';
						link.click();
						document.body.removeChild(link);
					});
				}


			}
		);
	})
})
</script>

完成之后,发现效果还不错。速度也比后端的来的块。毕竟不经过后端。而且可以多个请求异步处理。

原文地址: http://www.shiguopeng.cn/archives/442

631 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665436

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX