| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  | <template> | 
					
						
							|  |  |  |   <div class="upload-file"> | 
					
						
							|  |  |  |     <el-upload | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |       multiple | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |       :action="uploadFileUrl" | 
					
						
							|  |  |  |       :before-upload="handleBeforeUpload" | 
					
						
							|  |  |  |       :file-list="fileList" | 
					
						
							| 
									
										
										
										
											2022-02-16 21:38:04 +08:00
										 |  |  |       :limit="limit" | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |       :on-error="handleUploadError" | 
					
						
							| 
									
										
										
										
											2022-02-16 21:38:04 +08:00
										 |  |  |       :on-exceed="handleExceed" | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |       :on-success="handleUploadSuccess" | 
					
						
							|  |  |  |       :show-file-list="false" | 
					
						
							|  |  |  |       :headers="headers" | 
					
						
							|  |  |  |       class="upload-file-uploader" | 
					
						
							|  |  |  |       ref="upload" | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <!-- 上传按钮 --> | 
					
						
							|  |  |  |       <el-button size="mini" type="primary">选取文件</el-button> | 
					
						
							|  |  |  |       <!-- 上传提示 --> | 
					
						
							|  |  |  |       <div class="el-upload__tip" slot="tip" v-if="showTip"> | 
					
						
							|  |  |  |         请上传 | 
					
						
							|  |  |  |         <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template> | 
					
						
							|  |  |  |         <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template> | 
					
						
							|  |  |  |         的文件 | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </el-upload> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <!-- 文件列表 --> | 
					
						
							|  |  |  |     <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> | 
					
						
							| 
									
										
										
										
											2022-02-17 19:19:29 +08:00
										 |  |  |       <li :key="file.url" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> | 
					
						
							| 
									
										
										
										
											2022-05-11 12:40:54 +08:00
										 |  |  |         <el-link :href="`${file.url}`" :underline="false" target="_blank"> | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |           <span class="el-icon-document"> {{ getFileName(file.name) }} </span> | 
					
						
							|  |  |  |         </el-link> | 
					
						
							|  |  |  |         <div class="ele-upload-list__item-content-action"> | 
					
						
							|  |  |  |           <el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       </li> | 
					
						
							|  |  |  |     </transition-group> | 
					
						
							|  |  |  |   </div> | 
					
						
							|  |  |  | </template> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <script> | 
					
						
							| 
									
										
										
										
											2022-05-09 19:40:10 +08:00
										 |  |  | import { getAccessToken } from "@/utils/auth"; | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default { | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  |   name: "FileUpload", | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |   props: { | 
					
						
							|  |  |  |     // 值
 | 
					
						
							|  |  |  |     value: [String, Object, Array], | 
					
						
							| 
									
										
										
										
											2022-02-16 21:38:04 +08:00
										 |  |  |     // 数量限制
 | 
					
						
							|  |  |  |     limit: { | 
					
						
							|  |  |  |       type: Number, | 
					
						
							|  |  |  |       default: 5, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |     // 大小限制(MB)
 | 
					
						
							|  |  |  |     fileSize: { | 
					
						
							|  |  |  |       type: Number, | 
					
						
							|  |  |  |       default: 5, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     // 文件类型, 例如['png', 'jpg', 'jpeg']
 | 
					
						
							|  |  |  |     fileType: { | 
					
						
							|  |  |  |       type: Array, | 
					
						
							|  |  |  |       default: () => ["doc", "xls", "ppt", "txt", "pdf"], | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     // 是否显示提示
 | 
					
						
							|  |  |  |     isShowTip: { | 
					
						
							|  |  |  |       type: Boolean, | 
					
						
							|  |  |  |       default: true | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   data() { | 
					
						
							|  |  |  |     return { | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |       number: 0, | 
					
						
							|  |  |  |       uploadList: [], | 
					
						
							| 
									
										
										
										
											2022-05-11 12:40:54 +08:00
										 |  |  |       uploadFileUrl: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
 | 
					
						
							|  |  |  |       headers: { Authorization: "Bearer " + getAccessToken() }, // 设置上传的请求头部
 | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |       fileList: [], | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  |   watch: { | 
					
						
							|  |  |  |     value: { | 
					
						
							|  |  |  |       handler(val) { | 
					
						
							|  |  |  |         if (val) { | 
					
						
							|  |  |  |           let temp = 1; | 
					
						
							|  |  |  |           // 首先将值转为数组
 | 
					
						
							|  |  |  |           const list = Array.isArray(val) ? val : this.value.split(','); | 
					
						
							|  |  |  |           // 然后将数组转为对象数组
 | 
					
						
							|  |  |  |           this.fileList = list.map(item => { | 
					
						
							|  |  |  |             if (typeof item === "string") { | 
					
						
							|  |  |  |               item = { name: item, url: item }; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             item.uid = item.uid || new Date().getTime() + temp++; | 
					
						
							|  |  |  |             return item; | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           this.fileList = []; | 
					
						
							|  |  |  |           return []; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       deep: true, | 
					
						
							|  |  |  |       immediate: true | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |   computed: { | 
					
						
							|  |  |  |     // 是否显示提示
 | 
					
						
							|  |  |  |     showTip() { | 
					
						
							|  |  |  |       return this.isShowTip && (this.fileType || this.fileSize); | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  |   methods: { | 
					
						
							|  |  |  |     // 上传前校检格式和大小
 | 
					
						
							|  |  |  |     handleBeforeUpload(file) { | 
					
						
							|  |  |  |       // 校检文件类型
 | 
					
						
							|  |  |  |       if (this.fileType) { | 
					
						
							|  |  |  |         let fileExtension = ""; | 
					
						
							|  |  |  |         if (file.name.lastIndexOf(".") > -1) { | 
					
						
							|  |  |  |           fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const isTypeOk = this.fileType.some((type) => { | 
					
						
							|  |  |  |           if (file.type.indexOf(type) > -1) return true; | 
					
						
							| 
									
										
										
										
											2022-05-11 12:40:54 +08:00
										 |  |  |           return !!(fileExtension && fileExtension.indexOf(type) > -1); | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |         }); | 
					
						
							|  |  |  |         if (!isTypeOk) { | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |           this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`); | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |           return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       // 校检文件大小
 | 
					
						
							|  |  |  |       if (this.fileSize) { | 
					
						
							|  |  |  |         const isLt = file.size / 1024 / 1024 < this.fileSize; | 
					
						
							|  |  |  |         if (!isLt) { | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |           this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`); | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |           return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |       this.$modal.loading("正在上传文件,请稍候..."); | 
					
						
							|  |  |  |       this.number++; | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |       return true; | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-02-16 21:38:04 +08:00
										 |  |  |     // 文件个数超出
 | 
					
						
							|  |  |  |     handleExceed() { | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |       this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`); | 
					
						
							| 
									
										
										
										
											2022-02-16 21:38:04 +08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |     // 上传失败
 | 
					
						
							|  |  |  |     handleUploadError(err) { | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |       this.$modal.msgError("上传图片失败,请重试"); | 
					
						
							|  |  |  |       this.$modal.closeLoading() | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     // 上传成功回调
 | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |     handleUploadSuccess(res) { | 
					
						
							| 
									
										
										
										
											2022-05-11 12:40:54 +08:00
										 |  |  |       // edit by 芋道源码
 | 
					
						
							|  |  |  |       this.uploadList.push({ name: res.data, url: res.data }); | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |       if (this.uploadList.length === this.number) { | 
					
						
							|  |  |  |         this.fileList = this.fileList.concat(this.uploadList); | 
					
						
							|  |  |  |         this.uploadList = []; | 
					
						
							|  |  |  |         this.number = 0; | 
					
						
							|  |  |  |         this.$emit("input", this.listToString(this.fileList)); | 
					
						
							|  |  |  |         this.$modal.closeLoading(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     // 删除文件
 | 
					
						
							|  |  |  |     handleDelete(index) { | 
					
						
							|  |  |  |       this.fileList.splice(index, 1); | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  |       this.$emit("input", this.listToString(this.fileList)); | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     // 获取文件名称
 | 
					
						
							|  |  |  |     getFileName(name) { | 
					
						
							|  |  |  |       if (name.lastIndexOf("/") > -1) { | 
					
						
							| 
									
										
										
										
											2022-03-20 22:07:17 +08:00
										 |  |  |         return name.slice(name.lastIndexOf("/") + 1); | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |       } else { | 
					
						
							|  |  |  |         return ""; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2022-02-16 21:41:08 +08:00
										 |  |  |     // 对象转成指定字符串分隔
 | 
					
						
							|  |  |  |     listToString(list, separator) { | 
					
						
							|  |  |  |       let strs = ""; | 
					
						
							|  |  |  |       separator = separator || ","; | 
					
						
							|  |  |  |       for (let i in list) { | 
					
						
							|  |  |  |         strs += list[i].url + separator; | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-05-11 12:40:54 +08:00
										 |  |  |       return strs !== '' ? strs.substr(0, strs.length - 1) : ''; | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-02-11 18:06:49 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <style scoped lang="scss"> | 
					
						
							|  |  |  | .upload-file-uploader { | 
					
						
							|  |  |  |   margin-bottom: 5px; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .upload-file-list .el-upload-list__item { | 
					
						
							|  |  |  |   border: 1px solid #e4e7ed; | 
					
						
							|  |  |  |   line-height: 2; | 
					
						
							|  |  |  |   margin-bottom: 10px; | 
					
						
							|  |  |  |   position: relative; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .upload-file-list .ele-upload-list__item-content { | 
					
						
							|  |  |  |   display: flex; | 
					
						
							|  |  |  |   justify-content: space-between; | 
					
						
							|  |  |  |   align-items: center; | 
					
						
							|  |  |  |   color: inherit; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | .ele-upload-list__item-content-action .el-link { | 
					
						
							|  |  |  |   margin-right: 10px; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2022-02-16 21:34:17 +08:00
										 |  |  | </style> |