vue实现页面上传文件夹压缩后传给服务器的操作
vue实现页面上传文件夹压缩后传给服务器
需求:点击页面按钮上传文件夹,但是需要经过前端压缩后再上传到服务器(至于为什么不先打好压缩包再直接上传,领导的意思是他要上传的文件在本地是加密的,上传到浏览器的文件是解密的,并不是很懂但是需求还是得完成)
1.首先下载所需要的插件jszip和FileSaver
npm install jszip npm install file-saver //主要用来下载文件验证上传是否正确,不是刚需 //页面引入 import JSZip from "jszip"; import FileSaver from "file-saver";
2.页面标签的话只需要一个button按钮即可
<el-form-item label="上传模板:" prop="fileName"> <el-button @click="handleChange">上传文件夹</el-button> </el-form-item>
3.完整代码
handleChange() { let input = document.createElement("input"); input.type = "file"; input.setAttribute("allowdirs", "true"); input.setAttribute("directory", "true"); input.setAttribute("webkitdirectory", "true"); //设置了webkitdirectory就可以选择文件夹进行上传了,el-upload也适用但方法不一样 input.multiple = false; document.querySelector("body").appendChild(input); input.click(); let _this = this; input.onchange = async function (e) { let file = e.target["files"]; let path = file[0].webkitRelativePath; //取path是为了获取上传的文件夹一级的名称 let name = path.split("/")[0]; console.log(name); let zip = new JSZip(); _this.forEachZip(zip, file); //处理文件夹里的所有子文件 // 生成压缩文件 zip.generateAsync({ type: "blob" }).then((content) => { //将blob类型的再转为file类型用于上传 let zipFile = new File([content], `${name}.zip`, { type: "application/zip", }); //做个大小限制 let isLt2M = zipFile.size / 1024 / 1024 < 80; if (!isLt2M) { _this.fileList = []; _this.$message({ message: "上传文件大小不能超过 80MB!", type: "warning", }); return false; } else { let filedata = new FormData(); filedata.append("file", zipFile); _this.handlesubmit(filedata); //这个地方换成自己的上传事件即可,filedata已经是压缩好的文件了 // FileSaver.saveAs(content, `${name}.zip`); //下载用,可以下载下来文件查看上传的是否正确 } }); document.querySelector("body").removeChild(input); }; }, forEachZip(zip, files) { for (let i = 0; i < files.length; i++) { //通过path将文件夹里的所有子文件归类处理,主要是为了保持上传后的文件夹目录保持不变 zip.file(files[i].webkitRelativePath, files[i]); //如果想上传后将里面的所有文件夹都归类到一级可以用下面的方式 // let file = files[i]; // zip.file(file.name, file); } },
Vue 项目使用 jszip 和 file-saver 打包压缩上传文件夹
安装包
npm install jszip npm install file-saver
引入包
import { saveAs } from 'file-saver' import JSZip from 'jszip'
1.设置input上传文件
<input type="file" webkitdirectory="true" directory="true" @click="onupclick" @change="uploadFiles" style="width: 70px" />
2.当我们上传完,必须的刷新页面才能继续上传,只需要设置下面的即可,再次上传
function onupclick(e: any) { percentage.value = 0;//上传进度,可以使用element plus 进度条组件 e.target.files = null; e.target.value = ''; }
3.设置上传函数
async function uploadFiles(e) { let res = await zipFile(2, e.target.files); const file = new File([res], 'projectdist.zip');//'projectdist.zip'为设置的文件名 upzip({ ftype: 1, file: file, mode: mode.value }); } async function zipFile(index: number, fileList: FileList, onProgress: (added: number) => void) { const zip = new JSZip(); let i = 0; for await (let f of fileList) { const fileData = await readAsArrayBuffer(f); zip.file(f.webkitRelativePath, fileData, { createFolders: true }); i++; onProgress && onProgress(i); } return zip.generateAsync({ type: 'blob', compression: 'DEFLATE', compressionOptions: { level: 9 } }, function updateCallback(metadata) { // 进度条 percentage.value = +metadata.percent.toFixed(2); // console.log('进度条', metadata.percent.toFixed(2) + '% done'); }); //zip.generateAsync({ type: 'blob' }) // .then(function (zipBlob) { // 在这里可以进行上传操作,将 zipBlob 发送到服务器 // 也可以通过 FileSaver.js 将 ZIP 文件保存到本地 // FileSaver.saveAs(zipBlob, '压缩包名称.zip'); // }) //.catch(function (error) { // console.error('压缩视频失败:', error); // }); } async function readAsArrayBuffer(file: Blob): Promise<ArrayBuffer> { return new Promise((resolve, reject) => { let reader = new FileReader(); reader.readAsArrayBuffer(file); reader.onload = () => { resolve(reader.result as ArrayBuffer); }; reader.onloadend = () => { reject('FileReader failed'); }; }); } //把文件上传给服务端 async function upzip(formData: any) { try { const { code, msg } = await upload_file(formData); if (code > 0) { ElMessage({ showClose: true, message: '上传成功', type: 'success', }); } else { ElMessage({ showClose: true, message: '上传失败' + msg, type: 'error', duration: 0, }); } } catch (e) { ElMessage({ showClose: true, message: '错误: ' + e, type: 'error', duration: 0, }); } }
到此这篇关于vue实现页面上传文件夹压缩后传给服务器的文章就介绍到这了,更多相关vue上传文件夹压缩传给服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
webpack+vuex+axios 跨域请求数据的示例代码
本篇文章主要介绍了webpack+vuex+axios 跨域请求数据,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-03-03Vue.extend和VueComponent的关系源码解析
这篇文章主要为大家详解了Vue.extend和VueComponent的关系源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-02-02ElementUI el-table 树形数据的懒加载的实现
当面对大量数据时,一次性加载所有数据可能会导致性能问题,我们可以实现树形数据的懒加载,本文主要介绍了ElementUI el-table 树形数据的懒加载,感兴趣的可以了解一下2024-06-06
最新评论