vue实现页面上传文件夹压缩后传给服务器的操作

 更新时间:2023年09月15日 11:16:26   作者:LingSnow1019  
这篇文章主要介绍了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上传文件夹压缩传给服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何利用vue.js实现拖放功能

    如何利用vue.js实现拖放功能

    这篇文章主要给大家介绍了如何利用vue.js实现拖放功能的相关资料,本文并未使用现有的库,而是使用内置的HTML拖放API来实现简单的拖放系统,需要的朋友可以参考下
    2021-06-06
  • webpack+vuex+axios 跨域请求数据的示例代码

    webpack+vuex+axios 跨域请求数据的示例代码

    本篇文章主要介绍了webpack+vuex+axios 跨域请求数据,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Vue.extend和VueComponent的关系源码解析

    Vue.extend和VueComponent的关系源码解析

    这篇文章主要为大家详解了Vue.extend和VueComponent的关系源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Element UI安装全过程

    Element UI安装全过程

    element ui 就是基于vue的一个ui框架,该框架基于vue开发了很多相关组件,方便我们快速开发页面,饿了么前端团队基于vue进行开发并且进行了开源 element ui 中提供全部都是封装好组件,本文给大家介绍Element UI安装全过程,感兴趣的朋友一起看看吧
    2024-01-01
  • vue3项目新用户引导组件driver.js示例详解

    vue3项目新用户引导组件driver.js示例详解

    好用的用户引导插件有 intro.js 和 driver.js 两个,对比了一下,最终还是使用了driver.js,这篇文章主要介绍了vue3项目新用户引导组件(driver.js),需要的朋友可以参考下
    2022-08-08
  • 解决echarts中横坐标值显示不全(自动隐藏)问题

    解决echarts中横坐标值显示不全(自动隐藏)问题

    这篇文章主要介绍了解决echarts中横坐标值显示不全(自动隐藏)问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue router 用户登陆功能的实例代码

    vue router 用户登陆功能的实例代码

    这篇文章主要介绍了vue router 用户登陆功能的实例代码,主要用到H5中的会话存储(sessionStorage)、vue-router路由前置操作、路由元信息(meta)等知识点,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2019-04-04
  • ElementUI el-table 树形数据的懒加载的实现

    ElementUI el-table 树形数据的懒加载的实现

    当面对大量数据时,一次性加载所有数据可能会导致性能问题,我们可以实现树形数据的懒加载,本文主要介绍了ElementUI el-table 树形数据的懒加载,感兴趣的可以了解一下
    2024-06-06
  • Vue Hook Event 深度解读

    Vue Hook Event 深度解读

    Hook Event 是 Vue 的自定义事件结合生命周期钩子实现的一种从组件外部为组件注入额外生命周期方法的功能,本文重点给大家介绍Vue Hook Event 解读,感兴趣的朋友一起看看吧
    2023-01-01
  • vue中实现千位分隔符的示例代码

    vue中实现千位分隔符的示例代码

    本文主要介绍了vue中实现千位分隔符的示例代码,主要两种方法,一种是某一个字段转换,一种是表格table中的整列字段转换,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论