前言:这里呢主要针对ElementUI的上传进行优化,上传之后是做假上传,然后进行本地预览, 可以避免服务端资源的浪费和不必要的接口请求。当然,这里只针对图片这种类型。
- 之所以这样做的原因呢,主要是为了避免服务端(后端)资源的浪费,因为有些用户他上传之后,可能不是真的上传,或者上传错了,此时就把资源发到服务端,这样就很不好,我看目前网上很多方案还是这样做,非常不建议
- 另一方面,基于图片本身的特性,可以转为base64,然后进行预览,JS是有这部分的功能的,但是对于大尺寸或高分辨率的图片可能会导致性能下降和内存占用增加,这里还是要视情况而定
- HTML,需要用自定义上传http-request
1 2 3 4 5 6 7 8 9 10 11
| <el-upload drag action :http-request="previewUpload" multiple :limit="5" :on-exceed="exceed"> <el-icon class="el-icon--upload"><upload-filled /></el-icon> <div class="el-upload__text"> <em>{{ i18n.t('text.clickToUpload') }}</em> </div> <template #tip> <div class="el-upload__tip" style="padding: 10px; font-size: 14px;"> <div style="padding-top: 10px;">已選擇圖片</div> </div> </template> </el-upload>
|
- JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| const previewUpload = (uploadData) => { const reader = new FileReader(); reader.onload = function(e) { const result = e.target.result; const tmp = { uid: uploadData.file.uid, url: result, uploadData: uploadData } previewArr.value.push(tmp) } reader.readAsDataURL(uploadData.file); }
const beforeUpload = (file) => { const types = ['image/jpeg', 'image/jpg', 'image/gif', 'image/bmp', 'image/png']; const isImage = types.includes(file.type); const isLtSize = file.size / 1024 / 1024 < 5; if (!isImage) { ElMessage({ message: '只能上傳圖片類型', type: 'warning', }) return false; } if (!isLtSize) { ElMessage({ message: '上传图片大小不能超过 5MB!', type: 'warning', }) return false; } return true; }
const exceed = () => { ElMessage({ message: '最多只能上傳5張圖片', type: 'warning', }) }
|