文件上传前的压缩、加密;以及下载前的解压缩、解密

6 篇文章 0 订阅

 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="https://cdn.bootcdn.net/ajax/libs/jszip/3.6.0/jszip.min.js"></script>
		<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
	</head>
	<body>
		<input id="input" type="file" name="file" accept=".pdf" onchange="afterRead()">
	</body>
	<script>
		function afterRead(){
			let file = document.getElementById('input').files[0];
			/*文件压缩 zip*/
			fileJSZip(file).then(function(content){
				/*zip转base64*/
				fileToBase64(content).then(function(fileZip){
					//aes加密
					let key = CreateAesKey();
					let iv = CreateAesIv();
					let fileARS = EncryptByAES(key,iv,fileZip)
					
					//aes解密
					let orginFile = DecryptByAES(key,iv,fileARS)
					
					//base64转zip
					let orginFileZip = base64ToBlob(orginFile)
					
					//解压缩
					let zip = new JSZip();
					zip.loadAsync(orginFileZip, {optimizedBinaryString: true}).then(resZip=>{
						for (let key in resZip.files) {
							let fileName = resZip.files[key].name
							// 用blob的格式读取,方便后面下载到本地
							let base = resZip.file(resZip.files[key].name).async('blob')
							base.then(res => {
								// 创建隐藏的可下载链接
								var eleLink = document.createElement('a');
								eleLink.download = fileName;
								eleLink.style.display = 'none';
								// 下载内容转变成blob地址
								let fileBolb = new Blob([res])
								console.log(fileBolb)
								eleLink.href = URL.createObjectURL(fileBolb);
								// 触发点击
								document.body.appendChild(eleLink);
								eleLink.click();
								// 然后移除
								document.body.removeChild(eleLink);
							})
						}
					})
					
					
				})
				
			});
			
		}
		
		/**
		 * 压缩文件
		 */
		function fileJSZip(file){
			return new Promise(function(resolve){
				var zip = new JSZip(); //生成一个压缩包对象
				zip.file(file.name, file);  //将上传的内容添加进压缩包内
				zip.generateAsync({
					type:"Blob",
					compression: "DEFLATE",
					compressionOptions: {
						level: 9 // 压缩等级1~9 1压缩速度最快,9最优压缩方式
					}
				}).then(function(content){
					var fileZip = new File([content],file.name+'.zip',{type: "application/zip"});
					return resolve(fileZip)
				});
			})
		}
		
		function fileToBlob(file) {
		    return new Promise((resolve, reject) => {
		        let reader = new FileReader()
		        reader.readAsArrayBuffer(file)
		        let blob = null
		        reader.onload = (e) => {
		            if (typeof e.target.result === 'object') {
		                blob = new Blob([e.target.result])
		            } else {
		                blob = e.target.result
		            }
		            resolve(blob)
		        }
		    })
		}
		
		/**
		 * 文件转base64
		 * @param file
		 */
		function fileToBase64(file) {
		    return new Promise(resolve => {
		        let reader = new FileReader()
		        reader.readAsDataURL(file)
		        reader.onload = function(e) {
		            resolve(e.target.result)
		        }
		    })
		}
		
		function base64ToBlob(base64) {
		    let arr = base64.split(',')
		    let contentType = arr[0].match(/:(.*?);/)[1]
		    let bstr = atob(arr[1])
		    let n = bstr.length
		    let u8arr = new Uint8Array(n)
		    while (n--) {
		        u8arr[n] = bstr.charCodeAt(n)
		    }
		    return new Blob([u8arr], { type: contentType })
		}
		
		/**
		 * 生成AES key
		 */
		function CreateAesKey() {
		  var wordArray = CryptoJS.lib.WordArray.random(16)
		  //默认字母小写,手动转大写
		  return wordArray.toString(CryptoJS.enc.Base64)
		}
		
		/**
		 * 生成AES IV
		 */
		 function CreateAesIv() {
			var wordArray = CryptoJS.lib.WordArray.random(16)
			//默认字母小写,手动转大写
			return wordArray.toString(CryptoJS.enc.Base64)
		}
		
		/**
		 * AES/CBC/PKCS5Padding 加密
		 */
		function EncryptByAES(key, iv, content) {
			key = CryptoJS.enc.Base64.parse(key)
			iv = CryptoJS.enc.Base64.parse(iv)
			let srcs = CryptoJS.enc.Utf8.parse(content);
			let encrypted = CryptoJS.AES.encrypt(srcs, key, {
				iv: iv,
				mode: CryptoJS.mode.CBC,
				padding: CryptoJS.pad.Pkcs7
		    })
		    return encrypted.toString()
		}
		
		/**
		 * AES/CBC/PKCS5Padding 解密
		 */
		function DecryptByAES(key, iv, content) {
		    key = CryptoJS.enc.Base64.parse(key)
		    iv = CryptoJS.enc.Base64.parse(iv)
		    let decrypt = CryptoJS.AES.decrypt(content, key, {
				iv: iv,
				mode: CryptoJS.mode.CBC,
				padding: CryptoJS.pad.Pkcs7
		    })
		    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
		    return decryptedStr.toString()
		}
	</script>
</html>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java文件压缩加密是一种将Java文件进行压缩加密保护的技术。通过对文件进行压缩,可以减小文件的体积,方便传输和存储。而通过加密文件,可以保护文件的内容,防止未经授权的人员获取和修改文件。 在Java中,可以使用压缩加密相关的类和方法来实现文件压缩加密操作。常用的压缩类有java.util.zip.ZipOutputStream和java.util.zip.ZipInputStream,通过这些类可以将文件或文件夹压缩zip格式的压缩包,或者解压缩已有的压缩包。 对于文件加密,可以使用Java提供的加密算法和密码库来实现。常用的加密算法有对称加密算法和非对称加密算法。对称加密算法如AES和DES可以使用相同的密钥进行加密解密,而非对称加密算法如RSA则需要一对公钥和私钥进行加密解密。通过在程序中使用对应的算法和密钥,可以将文件内容加密后保存,只有使用正确的密钥才能解密文件内容。 在实现文件压缩加密时,可以先将文件进行压缩,然后再对压缩后的文件进行加密操作。这样可以同时达到减小文件体积和保护文件内容的目的。在传输或存储文件时,可以先解密解压缩,得到原始的文件内容。 总之,Java文件压缩加密是一种通过压缩加密的方式保护文件内容的技术,通过使用Java提供的压缩加密类、算法和密码库,可以方便地实现文件的压缩加密操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值