中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

重慶網(wǎng)站建設(shè)哪家公司那家好每日關(guān)鍵詞搜索排行

重慶網(wǎng)站建設(shè)哪家公司那家好,每日關(guān)鍵詞搜索排行,wordpress下載類插件,如何能讓企業(yè)做網(wǎng)站的打算1、html 代碼&#xff1a; 代碼中的表格引入了 vxe-table 插件 <Tag /> 是自己封裝的說明組件 表格列表這塊我使用了插槽來增加擴(kuò)展性&#xff0c;可根據(jù)自己需求&#xff0c;在組件外部做調(diào)整 <template><div class"dragUpload"><el-dialo…

1、html 代碼:

代碼中的表格引入了 vxe-table 插件

<Tag /> 是自己封裝的說明組件

表格列表這塊我使用了插槽來增加擴(kuò)展性,可根據(jù)自己需求,在組件外部做調(diào)整

<template><div class="dragUpload"><el-dialog v-model="data.visible"width="35%"center:draggable="draggable":destroy-on-close="true":close-on-click-modal="false":close-on-press-escape="false":before-close="closeDialogFn"><template #header><h3>{{ fileData.step === 2 ? '提示:文件超出大小限制' : '拖拽上傳'}}</h3></template><!-- 文件上傳區(qū)域 --><div class="drag-box"v-if="fileData.step === 1"@dragover="handleDragOver"@dragleave="handleDragOver"@drop="handleDrop"><div class="div-text" ><div class="drag-tip">拖拽文件至此區(qū)域<span class="click-txt" @click="toUploadFloder">點擊上傳</span></div><div class="btn-wrap"><el-button v-if="singleFile" @click="toUploadFile">上傳文件</el-button><el-button @click="toUploadFloder">上傳文件夾</el-button><inputv-if="singleFile":style="{ display: 'none' }"type="file"ref="fileUploadRef"@change="handleFileChange"multiple/><input:style="{ display: 'none' }"type="file"ref="fileUploadFloderRef"@change="handleFloderChange"webkitdirectorymultiple/></div></div></div><!-- 超出限制后,展示的列表 --><div v-if="fileData.step === 2"><!-- 組件內(nèi)默認(rèn)展示 --><div class="max-h311" v-if="!openSlot"><vxe-table:data="fileData.goBeyondTable"height="100%":checkbox-config="{showHeader: true,trigger: 'cell'}"><template #empty><div class="no-data-box"><i class="icon_noData"></i><div class="m-t6">暫無數(shù)據(jù)</div></div></template><vxe-column min-width="180" :title="`${data.fileName || 'SPU'}文件名`"><template #default="{ row }">{{ row[fileData.firstFileName] ? row[fileData.firstFileName] : '--' }}</template></vxe-column><vxe-column min-width="111" title="大小"><template #default="{ row }">{{ row.size ? row.size : '--' }} MB</template></vxe-column><vxe-column width="100" title="操作" :visible="fileData.goBeyondTable.length > 1"><template #default="{ $rowIndex, row }"><el-tooltipcontent="移除"placement="top":hide-after="0"><a class="icon_delete f-s18"href="javscript:"@click="handleDelete($rowIndex, row)"></a></el-tooltip></template></vxe-column></vxe-table></div><!-- 插槽,可使用外部傳入 --><template v-else><slot name="errorTable"></slot></template></div><Tag class="m-t12"v-if="data.fileSize":content="fileData.step === 1 ? `文件大小不能超過 ${data.fileSize} MB` : `文件大小不能超過 ${data.fileSize}MB,目前文件大小 ${fileData.allSize} MB`"/><template #footer v-if="fileData.step === 2"><div class="dialog-footer"><el-button @click="closeDialogFn">取消</el-button><!-- 默認(rèn)使用內(nèi)部提交邏輯 --><template v-if="!openSlot"><el-button type="primary" @click="handleUploadToServer(true)">提交</el-button></template><!-- 開啟插槽,則使用外部自定義 --><template v-else><slot name="footerBtn"></slot></template></div></template></el-dialog></div>
</template>

2、js 代碼:

這塊主要思路是:將文件夾判斷后進(jìn)行遞歸,獲取出文件夾中的文件出來,最后類似單個文件上傳,然后將文件流進(jìn)行遍歷 append 進(jìn)創(chuàng)建的?FormData 對象。具體方法看:readFiles()

<script lang="ts" setup>
import { reactive, ref, getCurrentInstance } from 'vue';const { proxy }: any = getCurrentInstance();
const $tool = proxy.$tool;const props = defineProps({// 組件參數(shù)配置data: {type: Object,default: () => ({// fileSize: 100, // 文件大小限制// imgType: ['png', 'jpg', 'jpeg'], // 圖片類型限制// fileName: '', // 超出后列表展示的文件名:不傳默認(rèn)為SPU}),},// 是否支持窗口拖拽,默認(rèn)truedraggable: {type: Boolean,default: true},// 是否支持打開 file 單文件上傳,不傳默認(rèn)falsesingleFile: {type: Boolean,default: false},//是否需要開啟:列表上傳失敗 和 提交按鈕插槽:默認(rèn)不開啟,展示組件內(nèi)的失敗列表 和 提交邏輯openSlot: {type: Boolean,default: false}
});/*** @param dragUploadAxiosFn 上傳接口拋出,外部做處理,不與組件內(nèi)部邏輯耦合* @param dragUploadErrorTable 超出限制后,展示的列表插槽拋出,外部做處理,不與組件內(nèi)部邏輯耦合*/
const emit = defineEmits(['dragUploadAxiosFn', 'dragUploadErrorTable']);const fileUploadRef = ref();
const fileUploadFloderRef = ref();const fileData: any = reactive({step: 1, // 步驟: 1:文件拖拽上傳;2:文件超出提示uploadList: [], //上傳的文件列表waitUploadList: [], //存儲待上傳的文件列表fileSizeList: [], //存儲遍歷出來文件里面所有的圖片路徑及大小goBeyondTable: [], //超出限制后,將遍歷項還原成文件夾項展示的列表allSize: 0, //文件總大小 MBfirstFileName: 'pathName0' //第一列字段:key
});/*文件上傳input*/
const toUploadFile = () => {fileUploadRef.value.click();
};/*文件夾上傳input*/
const toUploadFloder = () => {fileUploadFloderRef.value.click();
};/*選擇文件改變*/
const handleFileChange = (e: any) => {if (e.target.files) {let filesList: any = Array.from(e.target.files);filesList.forEach((item: any) => {let size = item.size / 1024 / 1024;fileData.allSize += size;let obj: any = getPath(item.name);changeFileSizeList(item, obj);});fileData.allSize = fileData.allSize.toFixed(2); // 文件總大小 MBfileData.waitUploadList = filesList;if (!fileLimitFn(fileData.fileSizeList)) return; // 校驗方法handleUploadToServer(); //上傳文件到服務(wù)器}
};/*文件夾目錄上傳*/
const handleFloderChange = (e: any) => {if (e.target.files) {let filesList: any = Array.from(e.target.files);filesList.forEach((item: any) => { let size = item.size / 1024 / 1024;fileData.allSize += size;let obj: any = getPath(item.webkitRelativePath); // 通過路徑獲取名稱方法changeFileSizeList(item, obj);});filesList.reverse(); // 反轉(zhuǎn)數(shù)組,保證最先選擇的文件排在最后面fileData.allSize = fileData.allSize.toFixed(2); // 文件總大小 MBfileData.waitUploadList = filesList;if (!fileLimitFn(fileData.fileSizeList)) return; // 校驗方法handleUploadToServer(); //上傳文件到服務(wù)器}
};// 拖放進(jìn)入目標(biāo)區(qū)域
const handleDragOver = (event) => {event.preventDefault();
};// 拖拽放置
const handleDrop = async (event) => {event.preventDefault();const files = [];const promises: any[] = [];for (const item of event.dataTransfer.items) {const entry: any = item.webkitGetAsEntry();if (!entry.isDirectory && !props.singleFile) {proxy.$message.error(`只支持文件夾上傳,不支持單個文件上傳!`);return;}promises.push(readFiles(entry));}const resultFilesArrays = await Promise.all(promises); // 等待所有文件讀取完成fileData.waitUploadList = resultFilesArrays.flat();if (!fileLimitFn(fileData.fileSizeList)) return; // 校驗方法handleUploadToServer(); //上傳文件到服務(wù)器
};//文件各種限制判斷方法封裝
const fileLimitFn = (fileSizeList: any) => {console.log('fileData.fileSizeList', fileData.fileSizeList);//文件大小超出限制if (props.data.fileSize) {if (!fileSizeLimit(fileSizeList)) { fileData.goBeyondTable = getGoBeyondTable(fileSizeList);fileData.step = 2;return false;}}//圖片類型限制判斷if (props.data.imgType) {if (!fileImgType(fileSizeList)) return false;}return true;
};//文件超出限制
const fileSizeLimit = (fileSizeList: any) => {let allSize = fileSizeList.reduce((accumulator, currentValue) => {if (currentValue) {return accumulator + currentValue.size;}return accumulator;}, 0);let fileSize = props.data.fileSize * 1024 * 1024;fileData.allSize = (allSize / 1024 / 1024).toFixed(2); //存儲文件總大小 MBif (allSize > fileSize) {proxy.$message.error(`文件大小不能超過 ${props.data.fileSize} MB`);emit('dragUploadErrorTable', fileData);return false;}return true;
};// 文件中圖片,格式類型判斷
const fileImgType = (fileSizeList: any) => {let findList: any = fileSizeList.filter((item: any) => !props.data.imgType.includes(item.type));if (findList.length > 0) {proxy.$message.error(`圖片只能上傳 ${props.data.imgType} 格式`);return false;};return true;
};// 操作數(shù)據(jù):文件超出后,展示的列表
const getGoBeyondTable = (fileSizeList: any) => {// 遍歷,相同第一列為一項,size累加let result: any = fileSizeList.reduce((accumulator, current) => {if (accumulator[current[fileData.firstFileName]]) { //如果已經(jīng)存在,則累加sizeaccumulator[current[fileData.firstFileName]].size += current.size;} else {accumulator[current[fileData.firstFileName]] = { ...current };}return accumulator;}, {});// 將結(jié)果對象轉(zhuǎn)換回數(shù)組result = Object.values(result);// 處理size為MB單位result.forEach((item: any) => {item.size = (item.size / 1024 / 1024).toFixed(2);});return result;
};//移除超出文件列表的項
const handleDelete = (rowIndex: number, row: any) => {fileData.goBeyondTable.splice(rowIndex, 1);fileData.allSize = (fileData.allSize - row.size).toFixed(2); //更新總大小MBfileData.fileSizeList = fileData.fileSizeList.filter((item: any) => item[fileData.firstFileName] !== row[fileData.firstFileName]);fileData.waitUploadList = fileData.waitUploadList.filter((item: any) => item[fileData.firstFileName] !== row[fileData.firstFileName]);
};/*請求上傳到服務(wù)器*/
const handleUploadToServer = (clcik?: boolean) => {fileData.uploadList = fileData.waitUploadList;if (clcik && fileData.allSize > props.data.fileSize) {proxy.$message.error(`文件大小不能超過 ${props.data.fileSize} MB`);return;}let formData = new FormData();fileData.uploadList.forEach((item: any) => {formData.append(`${item.filePathName}`, item);});// // 遍歷FormData對象并打印其內(nèi)容:查看FormData對象數(shù)據(jù)是否正確// for (let [key, value] of formData.entries()) {//     console.log(`${key}: ${value}`);// }emit('dragUploadAxiosFn', formData, fileData.uploadList); //上傳參數(shù)拋出,外部做操作,不在組件做耦合
};//此方法:如果是文件夾,則會遞歸調(diào)用自己,所以最后都會走 else 的邏輯
const readFiles = async (item: any) => { if (item.isDirectory) {// 是一個文件夾const directoryReader = item.createReader();// readEntries是一個異步方法const entries: any[] = await new Promise((resolve, reject) => {directoryReader.readEntries(resolve, reject);});let files = [];for (const entry of entries) {const resultFiles: any = await readFiles(entry);files = files.concat(resultFiles);}return files;} else {// file也是一個異步方法const file = await new Promise((resolve, reject) => {item.file(resolve, reject);});let obj: any = getPath(item.fullPath); //通過路徑獲取名稱方法changeFileSizeList(file, obj);return [file];}
};//更改 fileData.fileSizeList 的值:公共
const changeFileSizeList = (file: any, obj: any) => {file.filePathName = obj.filePathName; //添加路徑名稱file[fileData.firstFileName] = obj.pathObj[fileData.firstFileName]; //添加第一列文件名file.pathObj = obj.pathObj;let index = file.name.lastIndexOf('.');fileData.fileSizeList.push({ //添加圖片路徑、大小、名稱filePathName: obj.filePathName,size: file.size,type: file.name.substring(index + 1),...obj.pathObj});
};//通過路徑獲取名稱方法:公共
const getPath = (path: string) => {let filePathName: any = path;  // 傳給后端的全路徑if (path.startsWith('/')) { // 如果路徑以斜杠開頭,則刪除第一個斜杠filePathName = path.slice(1);}let parts = filePathName.split('/'); // 路徑分割成數(shù)組let pathObj = {}; // 存儲每個部分for (let i = 0; i < parts.length; i++) {if (parts[i] !== '') { // 跳過空字符串(如果路徑以 / 開頭或結(jié)尾)pathObj['pathName' + (i)] = parts[i];}}return {filePathName: filePathName,pathObj: pathObj}
};//關(guān)閉事件
const closeDialogFn = () => {if (fileData.step === 1) {props.data.visible = false; //關(guān)閉彈窗return;}proxy.$messageBox({title: '關(guān)閉',message: '關(guān)閉后不會保留您所做的更改,確定關(guān)閉嗎?',callback: (value: string) => {//confirm=確認(rèn);cancel=取消if (value === 'confirm') {fileData.step = 1;props.data.visible = false; //關(guān)閉彈窗}}});
};
</script>

3、css 代碼:

<style lang="scss" scoped>
.drag-box {position: relative;.progress-bar {position: absolute;z-index: 100;width: 100%;top: 0;left: 0px;right: 0px;bottom: -5px;display: flex;justify-content: center;align-items: center;background-color: rgba(255, 255, 255, 0.8);:deep(.el-progress.el-progress--line) {width: 100%;margin-left: 10px;}}.uploaded-list-wrap {max-height: 200px;overflow-y: auto;.uploaded-item {display: flex;justify-content: space-between;align-items: center;cursor: pointer;margin-bottom: 3px;.text-content {width: 80%;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;}.icon {width: 25px;height: 25px;}.success-icon {display: block;}.delete-icon {display: none;}&:hover {.success-icon {display: none;}.delete-icon {display: block;}}}}
}.div-text {width: 100%;height: 250px;border: 1px dashed #00b7ee;border-radius: 10px;box-sizing: border-box;display: flex;flex-direction: column;justify-content: center;align-items: center;font-size: 18px;.click-txt {color: #00b7ee;cursor: pointer;}.btn-wrap {margin-top: 20px;}
}.min-h311 {min-height: 311px;
}.max-h311 {max-height: 311px;
}:deep(.el-dialog .el-dialog__header) {padding: 12px 16px;
}:deep(.el-dialog .el-dialog__body) {padding: 15px 30px 20px;
}</style>

4、vue 頁面中使用:

<!-- 拖拽上傳 -->
<DragUpload v-if="dragUpload.visible":data="dragUpload"@dragUploadAxiosFn="dragUploadAxiosFn"
/>
const dragUpload: any = reactive({visible: false,fileSize: 100, // 單位字節(jié) MBimgType: ['png', 'jpg', 'jpeg'], // 圖片類型限制fileName: 'SPU', // 超出后列表展示的文件名
});

?5、上傳到后端接口的參數(shù):

?6、效果圖,如下:

7、額外補(bǔ)充,后端接收文件流的方法:?

http://www.risenshineclean.com/news/52488.html

相關(guān)文章:

  • 做網(wǎng)站稅點免費個人網(wǎng)站注冊
  • 百度上如何做企業(yè)網(wǎng)站新東方培訓(xùn)機(jī)構(gòu)官網(wǎng)
  • 常德網(wǎng)站seo百度收錄官網(wǎng)
  • 網(wǎng)站創(chuàng)建風(fēng)格網(wǎng)站優(yōu)化排名哪家性價比高
  • 行業(yè)網(wǎng)站渠道選擇和內(nèi)容運營免費二級域名生成網(wǎng)站
  • 網(wǎng)站建設(shè)的技術(shù)需要多少錢下載百度網(wǎng)盤
  • 推廣網(wǎng)站利潤推廣普通話的意義是什么
  • 公司網(wǎng)站建設(shè)宣傳杭州網(wǎng)站seo推廣
  • 義烏網(wǎng)站建設(shè)微信開發(fā)2023年6月份疫情嚴(yán)重嗎
  • 微網(wǎng)站模板建設(shè)編程培訓(xùn)機(jī)構(gòu)排名前十
  • wordpress網(wǎng)站怎么打開資源網(wǎng)站快速優(yōu)化排名
  • 公司網(wǎng)站封面怎么做搜索引擎優(yōu)化的具體操作
  • 政協(xié)網(wǎng)站建設(shè)方案seo北京優(yōu)化
  • 網(wǎng)上哪些網(wǎng)站可以做兼職湖北seo
  • b2c十大平臺排名seo是搜索引擎營銷嗎
  • 桂平做網(wǎng)站公司百度seo怎么提高排名
  • 微信小程序開發(fā)網(wǎng)站谷歌瀏覽器官方app下載
  • 工作站seo云優(yōu)化是什么意思
  • 網(wǎng)站怎么做友情鏈接河南seo網(wǎng)站多少錢
  • 網(wǎng)站制作公司網(wǎng)站建設(shè)海外seo網(wǎng)站推廣
  • 高級營銷網(wǎng)站建設(shè)只需1200元營銷推廣的方法有哪些
  • 做招生網(wǎng)站軟文推廣例子
  • 做幼兒園成長冊的素材網(wǎng)站軟文發(fā)布平臺排名
  • 國外設(shè)計網(wǎng)站d百度官方網(wǎng)站首頁
  • 響應(yīng)式網(wǎng)站源碼快速收錄工具
  • 進(jìn)入網(wǎng)站服務(wù)器怎么做青島關(guān)鍵詞優(yōu)化平臺
  • 蘇州企業(yè)網(wǎng)站設(shè)計注冊網(wǎng)站多少錢
  • 如何搭建電子商務(wù)平臺佛山做seo推廣公司
  • 西部數(shù)碼個人網(wǎng)站seo實戰(zhàn)培訓(xùn)學(xué)校
  • 娛樂網(wǎng)站建設(shè)淄博網(wǎng)站制作優(yōu)化