摘要:今天有一個坑,同時要上傳圖片和文件,而且圖片要展示縮略圖,文件要展示列表。我的思路是首先,只上傳附件照片,這個直接看的官方例子就行,不僅僅上傳附件照片,還同時上傳其他參數(shù)。然后,再做上傳照片和文件,上傳其他參數(shù),其實也就是文件合并。
今天有一個坑,同時要上傳圖片和文件,而且圖片要展示縮略圖,文件要展示列表。
我的思路是:
首先,只上傳附件照片,這個直接看ele的官方例子就行,不僅僅上傳附件照片,還同時上傳其他參數(shù)。
然后,再做上傳照片和文件,上傳其他參數(shù),其實也就是文件合并。
一、上傳照片和其他參數(shù)頁面樣式大約就是這樣的,參數(shù)有優(yōu)先級,發(fā)生時間,服務(wù)單名稱,服務(wù)單描述,圖片附件上傳。
(一)視圖部分代碼:
說明:
1、action變量為后端圖片接口的地址
2、beforeUpload方法是指的上傳之前觸發(fā)的函數(shù),可以用來做前端文件格式判斷,文件大小判斷
3、on-change方法是指每次選擇文件都會觸發(fā)函數(shù),可以用來前端刪除和添加照片
4、list-type屬性指的是照片picture-card展示的方式
5、name指的是上傳的文件字段名,這是后端確認文件流的字段名,可以隨便寫
6、data屬性指的是上傳時附帶的額外參數(shù),這是指的其他參數(shù)
7、limit屬性指的是上傳文件的個數(shù)極限。
8、multiple屬性指的是可以每次多選文件,true為多選,false為單選
9、auto-upload屬性指的是自動上傳的,true為可以自動上傳,false為不可以自動上傳
10、on-preview方法指的是查看縮略圖的方法
11、on-remove方法指的是刪除文件的方法
12、ref綁定dom元素
(二)data部分代碼data () {
return { selectedCategorySpe: this.selectedCategory, serviceForm: { title: "", desc: "", priority: "", occurDate: "" }, dialogImageUrl: "", dialogVisible: false, uploadAction: "/inner/event/order/submit/submit" + "&accessToken=" + this.$store.getters.token }
},
(三)computed部分代碼computed: {
...mapGetters([ "constConfig" ]), paramsData: function () { let params = { eventCategory: this.selectedCategorySpe.categoryId, priority: this.serviceForm.priority, title: this.serviceForm.title, dsc: this.serviceForm.desc, occurDate: this.serviceForm.occurDate } return params }
},
使用computed實現(xiàn)實時監(jiān)測paramsData的值,只要selectedCategorySpe.categoryId,serviceForm.priority,serviceForm.title
,serviceForm.desc,serviceForm.occurDate中只有一個變化,都會重新計算paramsData的值。
(四)methods部分方法beforeUploadPicture(file){ const isImage = file.type == "image/png" || file.type == "image/jpg" || file.type == "image/jpeg" || file.type == "image/bmp" || file.type == "image/gif" || file.type == "image/webp"; const isLt2M = file.size < 1024 * 1024 * 2; if (!isImage) { this.$message.error("上傳只能是png,jpg,jpeg,bmp,gif,webp格式!"); } if (!isLt2M) { this.$message.error("上傳圖片大小不能超過 2MB!"); } return isImage && isLt2M; }, handlePictureCardPreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, handleRemovePicture(file, fileList) { console.log(file, fileList); }, imageChange(file, fileList, name) { console.log(file, fileList); },
confirm(){
this.$refs.upload.submit(); }
說明:confirm使用ref的綁定的upload,緊接著調(diào)用form的表單的submit方法。這個vue已經(jīng)封裝好了,這時候傳的參數(shù)可以看到post傳遞的文件對象。
二、同時上傳圖片和文件,并且圖片可以看縮略圖文件顯示成列表但是當(dāng)你出現(xiàn)這樣的需求的時候,一臉蒙蔽
(一)視圖部分代碼點擊上傳
data () { return { selectedCategorySpe: this.selectedCategory, serviceForm: { title: "", desc: "", priority: "", occurDate: "", }, images: {}, files: {}, dialogImageUrl: "", dialogVisible: false } },(3)method部分?jǐn)?shù)據(jù)
beforeUploadPicture(file){ const isImage = file.type == "image/png" || file.type == "image/jpg" || file.type == "image/jpeg" || file.type == "image/bmp" || file.type == "image/gif" || file.type == "image/webp"; const isLt2M = file.size < 1024 * 1024 * 2; if (!isImage) { this.$message.error("上傳只能是png,jpg,jpeg,bmp,gif,webp格式!"); } if (!isLt2M) { this.$message.error("上傳圖片大小不能超過 2MB!"); } return isImage && isLt2M; }, handlePictureCardPreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, handleRemovePicture(file, fileList) { console.log(file, fileList); }, imageChange(file, fileList, name) { console.log(file, fileList); this.imageList = fileList; this.images["images"] = fileList; }, handleRemoveFile(file, fileList) { console.log(file, fileList); }, handlePreviewFile(file) { console.log(file); }, handleExceedFile(files, fileList) { this.$message.warning(`當(dāng)前限制選擇 3 個文件,本次選擇了 ${files.length} 個文件,共選擇了 ${files.length + fileList.length} 個文件`); }, beforeRemoveFile(file, fileList) { return this.$confirm(`確定移除 ${ file.name }?`); }, fileChange(file,fileList) { console.log(file, fileList); this.fileList = fileList; this.files["files"] = fileList; },
confirm(){ let wfForm = new FormData(); wfForm.append( "eventCategory",this.selectedCategorySpe.categoryId) wfForm.append( "priority",this.serviceForm.priority) wfForm.append( "title",this.serviceForm.title) wfForm.append( "dsc",this.serviceForm.desc) wfForm.append( "occurDate",this.serviceForm.occurDate) Object.entries(this.images).forEach(file => { file[0].forEach(item => { // 下面的“images”,對應(yīng)后端需要接收的name,這樣對圖片和文件做一個區(qū)分,name為images為圖片 wfForm.append("images", item.raw) // wfForm.append(item.name, file[0]) }) }) Object.entries(this.files).forEach(file => { file[0].forEach(item => { // 下面的“files”,對應(yīng)后端需要接收的name,name為files為文件 wfForm.append("files", item.raw) //wfForm.append(item.name, file[0]) }) }) createEventOrder(wfForm).then( res => { console.log(res, "res") if(res.retValue === 1){ this.$message.success( "成功創(chuàng)建服務(wù)單" ); this.handleClose() }else{ } }) }
說明一下,新建了this.files存文件列表,this.images存圖片列表。在confirm中新建一個FormData對象,使用append方法將參數(shù)變量加到數(shù)據(jù)對象中,和文件對象。最后將FormData對象傳給后端。
傳遞的參數(shù)截圖如下:
這回對images和files,圖片和文件做區(qū)分,后端也需要做個判斷,其他的參數(shù)不需要的參數(shù)可以選擇不傳,需要增加新的參數(shù),使用append的方法添加。
2019.07.11【說明】根據(jù)評論中提到的問題
this.files[""] = fileList;
意義不大,這個就是想用一個對象存那個文件對象,對象需要一個name,自己取一個,也可以為空。改成這樣也行:
this.files["files"] = fileList;
這樣做的目的是如果你的文件上傳和圖片上傳用一個this.fileImage對象的話,在最后包裝formData的時候可以通過對象的name區(qū)分,哪個是文件,哪個是圖片,用一次
Object.entries(this.images).forEach
就可以把formData包裝好,更符合前端的高復(fù)用,低代碼的思想。
我怕有人理解不了這個,我還是補充一下代碼:
(2)data部分?jǐn)?shù)據(jù)(新增一個fileImage)
fileImage: {},
(3)methods中修改這塊
1、圖片上傳的這塊修改為
if(isImage && isLt2M){ this.imageList = fileList; this.fileImage["images"] = fileList;}else{ fileList.splice(-1,1); }
2、文件上傳的這塊修改為
if(!isImage && isLt2M){ this.fileList = fileList; this.fileImage["files"] = fileList;}else{ fileList.splice(-1,1); }
3、提交那塊,把兩個forEach合并成一個,然后直接取對象的name最為formData的name。
Object.entries(this.fileImage).forEach(file => { file[1].forEach(item => { wfForm.append(file[0], item.raw) }) })
最后也可以看到,也是ok的
【歡迎關(guān)注,有什么問題,歡迎提出,我看到有空就回答】
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/99795.html
摘要:前言要求圖片上傳支持多圖片上傳多瀏覽器圖片格式判斷多圖片同時上傳通過防并發(fā)設(shè)置防止可能出現(xiàn)的覆蓋圖片實時上傳后支持在新窗口中打開查看使用注意代碼中是頁面中存在循環(huán)很多上傳項,我為了省事直接復(fù)制粘貼的實現(xiàn),如果單項上傳就不用考慮了 前言 要求:1、圖片上傳支持多圖片上傳 +多瀏覽器圖片格式判斷;2、多圖片同時ajax上傳 通過防并發(fā)設(shè)置防止可能出現(xiàn)的覆蓋;3、圖片實時上傳后支持 在新窗口...
摘要:最近在嘗試著封裝一個框架,礙于種種原因,先從簡單的入手吧。基于和封裝的框架,集成數(shù)據(jù)存儲字體圖標(biāo)庫拓展語言網(wǎng)絡(luò)請求等模塊,為了讓業(yè)務(wù)開發(fā)更專注于數(shù)據(jù)驅(qū)動。 最近在嘗試著封裝一個框架,礙于種種原因,先從簡單的入手吧。基于vue和elementUI封裝的框架,集成 數(shù)據(jù)存儲localforage、字體圖標(biāo)庫font-awesome、css拓展語言scss、網(wǎng)絡(luò)請求axios等模塊,為了讓業(yè)...
摘要:如果插件是一個對象,必須提供方法。當(dāng)方法被同一個插件多次調(diào)用,插件將只會被安裝一次。的插件應(yīng)當(dāng)有一個公開方法。不用,去掉這個屬性,但是會污染全局樣式,可配合或者推薦,所有樣式寫在當(dāng)前組件或下面組件源碼放大圖片更多組件點擊這兒 這是一個簡單的點擊圖片預(yù)覽的組件順便記錄一下寫組件期間踩的vue中scope的坑~showImg(https://segmentfault.com/img/bVb...
摘要:之前在做網(wǎng)站換膚,所以今天想聊聊網(wǎng)站換膚的實現(xiàn)。一般實現(xiàn)如上圖,我們會看到在某些網(wǎng)站的右上角會出現(xiàn)這么幾個顏色塊,點擊不同的顏色塊,網(wǎng)站的整體顏色就被替換了。 之前在做網(wǎng)站換膚,所以今天想聊聊網(wǎng)站換膚的實現(xiàn)。網(wǎng)頁換膚就是修改顏色值,因此重點就在于怎么來替換。 一般實現(xiàn) showImg(https://user-images.githubusercontent.com/12515800/...
摘要:今天由于項目需要,想在組件上做一些變動和修改,我修改了的源代碼,發(fā)布到上去成功使用,記錄下過程中所碰到的問題。最后進行上傳上傳完成要是報各種看不懂的錯誤很大可能是包名重復(fù)。到項目中將項目中的中的中的修改為你的包名你的版本號。 今天由于項目需要,想在Tree組件上做一些變動和修改,我修改了elementUI的源代碼,發(fā)布到npm上去成功使用,記錄下過程中所碰到的問題。 下面簡單記錄下過程...
閱讀 818·2021-10-25 09:48
閱讀 610·2021-08-23 09:45
閱讀 2496·2019-08-30 15:53
閱讀 1758·2019-08-30 12:45
閱讀 585·2019-08-29 17:21
閱讀 3406·2019-08-27 10:56
閱讀 2546·2019-08-26 13:48
閱讀 690·2019-08-26 12:24