最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實(shí)現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的操作

 更新時(shí)間:2023年09月15日 11:16:26   作者:LingSnow1019  
這篇文章主要介紹了vue實(shí)現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的操作,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

vue實(shí)現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器

需求:點(diǎn)擊頁面按鈕上傳文件夾,但是需要經(jīng)過前端壓縮后再上傳到服務(wù)器(至于為什么不先打好壓縮包再直接上傳,領(lǐng)導(dǎo)的意思是他要上傳的文件在本地是加密的,上傳到瀏覽器的文件是解密的,并不是很懂但是需求還是得完成)

1.首先下載所需要的插件jszip和FileSaver

npm install jszip
npm install file-saver  //主要用來下載文件驗(yàn)證上傳是否正確,不是剛需
//頁面引入
import JSZip from "jszip";
import FileSaver from "file-saver";

2.頁面標(biāo)簽的話只需要一個(gè)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"); //設(shè)置了webkitdirectory就可以選擇文件夾進(jìn)行上傳了,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是為了獲取上傳的文件夾一級(jí)的名稱
      let name = path.split("/")[0];
      console.log(name);
      let zip = new JSZip();
      _this.forEachZip(zip, file); //處理文件夾里的所有子文件
      // 生成壓縮文件
      zip.generateAsync({ type: "blob" }).then((content) => {
      //將blob類型的再轉(zhuǎn)為file類型用于上傳
        let zipFile = new File([content], `${name}.zip`, {
          type: "application/zip",
        });
        //做個(gè)大小限制
        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); //這個(gè)地方換成自己的上傳事件即可,filedata已經(jīng)是壓縮好的文件了
          // 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]);
      //如果想上傳后將里面的所有文件夾都?xì)w類到一級(jí)可以用下面的方式
       // let file = files[i];
      // zip.file(file.name, file);
    }
  },

Vue 項(xiàng)目使用 jszip 和 file-saver 打包壓縮上傳文件夾

安裝包

npm install jszip
npm install file-saver

引入包

import { saveAs } from 'file-saver'
import JSZip from 'jszip'

1.設(shè)置input上傳文件

<input type="file" webkitdirectory="true" directory="true" @click="onupclick" @change="uploadFiles" style="width: 70px" />

2.當(dāng)我們上傳完,必須的刷新頁面才能繼續(xù)上傳,只需要設(shè)置下面的即可,再次上傳

function onupclick(e: any) {
	percentage.value = 0;//上傳進(jìn)度,可以使用element plus 進(jìn)度條組件
	e.target.files = null;
	e.target.value = '';
}

3.設(shè)置上傳函數(shù)

async function uploadFiles(e) {
	let res = await zipFile(2, e.target.files);
	const file = new File([res], 'projectdist.zip');//'projectdist.zip'為設(shè)置的文件名
	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) {
		// 進(jìn)度條
			percentage.value = +metadata.percent.toFixed(2);
		// console.log('進(jìn)度條', metadata.percent.toFixed(2) + '% done');
	});
 //zip.generateAsync({ type: 'blob' })
        //    .then(function (zipBlob) {
                // 在這里可以進(jìn)行上傳操作,將 zipBlob 發(fā)送到服務(wù)器
                // 也可以通過 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');
		};
	});
}
//把文件上傳給服務(wù)端
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: '錯(cuò)誤: ' + e,
			type: 'error',
			duration: 0,
		});
	}
}

到此這篇關(guān)于vue實(shí)現(xiàn)頁面上傳文件夾壓縮后傳給服務(wù)器的文章就介紹到這了,更多相關(guān)vue上傳文件夾壓縮傳給服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue iview實(shí)現(xiàn)分頁功能

    vue iview實(shí)現(xiàn)分頁功能

    這篇文章主要為大家詳細(xì)介紹了vue iview實(shí)現(xiàn)分頁功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Vuex mutitons和actions初使用詳解

    Vuex mutitons和actions初使用詳解

    這篇文章主要介紹了Vuex mutitons和actions初使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • vue interceptor 使用教程實(shí)例詳解

    vue interceptor 使用教程實(shí)例詳解

    本文通過實(shí)例代碼給大家介紹了vue interceptor 使用,需要的朋友可以參考下
    2018-09-09
  • vue3常用的指令之v-bind和v-on指令用法

    vue3常用的指令之v-bind和v-on指令用法

    vue的v-on與v-bind,v-on就是用于綁定事件的,下面這篇文章主要給大家介紹了關(guān)于vue3常用的指令之v-bind和v-on指令用法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • vue使用element-resize-detector監(jiān)聽元素寬度變化方式

    vue使用element-resize-detector監(jiān)聽元素寬度變化方式

    這篇文章主要介紹了vue使用element-resize-detector監(jiān)聽元素寬度變化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Vue組件開發(fā)之LeanCloud帶圖形校驗(yàn)碼的短信發(fā)送功能

    Vue組件開發(fā)之LeanCloud帶圖形校驗(yàn)碼的短信發(fā)送功能

    Vue是目前使用較廣泛的三大前端框架之一,其數(shù)據(jù)驅(qū)動(dòng)及組件化的特性使得前端開發(fā)更為快捷便利。本文在LeanCloud 短信轟炸與圖形校驗(yàn)碼官方文檔 基礎(chǔ)上,從封裝需要出發(fā)開發(fā)一個(gè)簡(jiǎn)單的短信圖形驗(yàn)證Vue組件,具體內(nèi)容詳情大家參考下本文
    2017-11-11
  • VUE3基礎(chǔ)學(xué)習(xí)之click事件詳解

    VUE3基礎(chǔ)學(xué)習(xí)之click事件詳解

    由于vue是一個(gè)雙向數(shù)據(jù)綁定的框架,它的點(diǎn)擊事件與以前常用的還是有很大的差別的,下面這篇文章主要給大家介紹了關(guān)于VUE3基礎(chǔ)學(xué)習(xí)之click事件的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Vue實(shí)現(xiàn)訂單支付倒計(jì)時(shí)功能

    Vue實(shí)現(xiàn)訂單支付倒計(jì)時(shí)功能

    這篇文章主要給大家介紹了Vue實(shí)現(xiàn)訂單支付倒計(jì)時(shí)功能,倒計(jì)時(shí)這要運(yùn)用在創(chuàng)建訂單后15分鐘內(nèi)進(jìn)行支付,否則訂單取消,本文結(jié)合示例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-08-08
  • Vue3.0數(shù)據(jù)響應(yīng)式原理詳解

    Vue3.0數(shù)據(jù)響應(yīng)式原理詳解

    這篇文章主要介紹了Vue3.0數(shù)據(jù)響應(yīng)式原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • vue解析Json數(shù)據(jù)獲取Json里面的多個(gè)id問題

    vue解析Json數(shù)據(jù)獲取Json里面的多個(gè)id問題

    這篇文章主要介紹了vue解析Json數(shù)據(jù)獲取Json里面的多個(gè)id問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

雷州市| 额敏县| 象山县| 府谷县| 巴马| 广西| 柳州市| 德庆县| 浑源县| 尉犁县| 泗水县| 左云县| 安龙县| 安庆市| 禄丰县| 青神县| 沈丘县| 泗阳县| 湖州市| 万宁市| 车险| 铁岭县| 江油市| 吐鲁番市| 吉安县| 郓城县| 澄江县| 彭阳县| 三河市| 昆山市| 阳曲县| 海兴县| 延边| 拜城县| 青铜峡市| 孟连| 木里| 雅安市| 崇义县| 潜山县| 巴青县|