JS下载文件、图片,JS打包下载

前段时间搞前端下载图片的功能,要求点击即下载,同时支持打包下载,并且支持多浏览器。

以前都是用<a>标签加download属性,但是这种方法只在极少数情况下可以下载,大多情况都是直接在浏览器展示出来的。

于是开始百度各路大神,终于找到了完美的解决办法。

经测试后,不仅可以下载图片,网络上的任何资源都可以下载,简直太完美了。

现在就分享下JS代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>JS文件下载</title>
	<script src="./js/jquery.js"></script>
    <!-- FileSaver.min.js:文件下载,见:https://www.jq22.com/jquery-info11353 -->
	<script src="./js/FileSaver/FileSaver.min.js"></script>
    <!-- jszip.js:打包下载,见:https://www.oschina.net/p/jszip -->
	<script src="./js/jszip/jszip.js"></script>
	<style>
	</style>
	<script>
		var zip;
		var zipName;
		var fileFolder;
		var fileList;
		var fileCount;
			
		function fileDownload(tagId){
			var url = $("#"+tagId).attr("src");
			var name = $("#"+tagId).attr("name");
			saveFile(url, name);
			//savePicture(url, name);//绘制图像
		}
		
		//保存文件,包括图片、文档、视频等
		function saveFile(url, name){
			var xhr = new XMLHttpRequest();
			xhr.open('get', url, true);
			xhr.responseType = 'blob';//二进制对象,binary
			xhr.onload = function () {
				var blob = xhr.response;//response 属性返回响应的正文,取决于 responseType 属性。
				saveAs(blob, name);//FileSaver.js提供的方法
			};
			xhr.send(null);
		}
		
		//绘制图像,不是源文件,图像大小会增大
		function savePicture(url, name){
			var image = new Image();
			image.setAttribute('crossOrigin', 'Anonymous'); // 设置 crossOrigin 属性,解决图片跨域报错
			image.src = url;
			image.onload = function(){
				var canvas = document.createElement('canvas');
				canvas.width = image.width;
				canvas.height = image.height;
				var ctx = canvas.getContext('2d');
				ctx.drawImage(image, 0, 0, image.width, image.height);//绘制图像,得到的图像并不是源url,而是重新绘制的
				var url = canvas.toDataURL('image/jpg', 1);
				var a = document.createElement("a"); // 生成一个a元素
				var event = new MouseEvent("click"); // 创建一个单击事件
				a.download = name; // 设置图片名称
				a.href = url; // 将生成的URL设置为a.href属性
				a.dispatchEvent(event); // 触发a的单击事件
			};
		}
		
		//打包下载:文件列表
		function fileDownloadZip(){
			zip = new JSZip();
			zipName = "test";
			fileFolder = zip.folder(zipName);
			fileList = [];
			fileCount = $("img").length;
			for(var i=0; i<fileCount; i++){
				var url = $("img").eq(i).attr("src");
				var name = $("img").eq(i).attr("name");
				saveFileZip(url, name);
			}
		}
		
		//打包下载:向压缩包添加文件
		function saveFileZip(url, name){
			var xhr = new XMLHttpRequest();
			xhr.open('get', url, true);
			xhr.responseType = 'blob';//二进制对象,binary
			xhr.onload = function () {
				var blob = xhr.response;//response 属性返回响应的正文,取决于 responseType 属性。
				fileList.push({name: name, content: blob});
				if (fileList.length === fileCount) {
					if (fileList.length) {
						for (var k = 0; k < fileList.length; k++) {
							// 往文件夹中,添加个文件的数据
							fileFolder.file(fileList[k].name, fileList[k].content, {
								binary: true //二进制
							})
						}
						zip.generateAsync({type: 'blob'}).then(function(content){
							saveAs(content, zipName+'.zip');
						})
					}
				}
			};
			xhr.send(null);
		}
	</script>
</head>
<body style="padding:20px;">
	<img id="img001" width="200" name="img001.jpg" src="https://img-blog.csdnimg.cn/a3f73553ad8f4bdeb3d83b4181d1810b.png">
	<div onclick="fileDownload('img001');" style="cursor:pointer">下载</div></br>
	</br>
	<img id="img002" width="200" name="img002.jpg" src="https://img-blog.csdnimg.cn/8f3084944c054ef3ae1658c4c202d208.png">
	<div onclick="fileDownload('img002');" style="cursor:pointer">下载</div></br>
	</br>
	<div onclick="fileDownloadZip();" style="cursor:pointer">打包下载</div></br>
</body>
</html>

源码包:https://download.csdn.net/download/qq_33427869/86773549

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
要实现js图片打包下载,可以使用canvas和FileSaver.js库。步骤如下: 1. 创建一个空的canvas元素,设置宽高等属性。 2. 在canvas上绘制图片,使用drawImage()方法。 3. 将canvas转换为DataURL数据,使用toDataURL()方法。 4. 将DataURL数据转换为Blob对象,使用dataURItoBlob()方法。 5. 使用FileSaver.js库将Blob对象保存为图片文件。 下面是一个示例代码: ```javascript // 引入FileSaver.js库 import { saveAs } from 'file-saver'; // 创建一个canvas元素 const canvas = document.createElement('canvas'); canvas.width = 800; canvas.height = 600; const ctx = canvas.getContext('2d'); // 加载图片 const img = new Image(); img.onload = function() { // 在canvas上绘制图片 ctx.drawImage(img, 0, 0, canvas.width, canvas.height); // 将canvas转换为DataURL数据 const dataUrl = canvas.toDataURL('image/png'); // 将DataURL数据转换为Blob对象 const blob = dataURItoBlob(dataUrl); // 使用FileSaver.js库将Blob对象保存为图片文件 saveAs(blob, 'image.png'); }; img.src = 'path/to/image.png'; // 将DataURL数据转换为Blob对象的方法 function dataURItoBlob(dataURI) { const byteString = atob(dataURI.split(',')[1]); const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; const ab = new ArrayBuffer(byteString.length); const ia = new Uint8Array(ab); for (let i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ab], { type: mimeString }); } ``` 在上面的代码中,需要先引入FileSaver.js库,然后创建一个canvas元素并设置宽高等属性。接着加载要打包下载图片,使用drawImage()方法将图片绘制到canvas上,然后将canvas转换为DataURL数据,再将其转换为Blob对象,最后使用FileSaver.js库将Blob对象保存为图片文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RainingTime

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

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

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

打赏作者

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

抵扣说明:

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

余额充值