ElementPlus的el-upload組件使用方式(圖片上傳)
el-upload 是 Element Plus 提供的文件上傳組件,支持多種上傳方式和豐富的配置選項(xiàng)。
下面我將詳細(xì)解析如何使用它實(shí)現(xiàn)圖片上傳功能。
1. 基本用法
<template>
<el-upload
action="/api/upload" // 上傳地址
list-type="picture-card" // 顯示為圖片卡片
:on-preview="handlePreview" // 點(diǎn)擊已上傳文件時(shí)的回調(diào)
:on-remove="handleRemove" // 移除文件時(shí)的回調(diào)
:on-success="handleSuccess" // 上傳成功回調(diào)
:on-error="handleError" // 上傳失敗回調(diào)
:file-list="fileList" // 已上傳文件列表
>
<i class="el-icon-plus"></i>
</el-upload>
</template>
<script setup>
import { ref } from 'vue';
const fileList = ref([]);
const handlePreview = (file) => {
console.log('預(yù)覽文件:', file);
};
const handleRemove = (file, fileList) => {
console.log('移除文件:', file, fileList);
};
const handleSuccess = (response, file, fileList) => {
console.log('上傳成功:', response, file, fileList);
};
const handleError = (err, file, fileList) => {
console.error('上傳失敗:', err, file, fileList);
};
</script>
2. 關(guān)鍵屬性詳解
上傳行為相關(guān)
action: 必填,上傳的URL地址method: 上傳方法,默認(rèn)為’post’data: 上傳時(shí)附帶的額外參數(shù)(對(duì)象或函數(shù))headers: 設(shè)置上傳的請(qǐng)求頭部with-credentials: 是否攜帶cookie,默認(rèn)為false
文件限制相關(guān)
multiple: 是否支持多選文件,默認(rèn)為falseaccept: 接受上傳的文件類型(如"image/*")limit: 最大允許上傳個(gè)數(shù)file-list: 已上傳的文件列表auto-upload: 是否在選取文件后立即上傳,默認(rèn)為true
顯示相關(guān)
list-type: 文件列表展示方式,可選值:
text(默認(rèn))picturepicture-card
drag: 是否啟用拖拽上傳
3. 完整示例(帶表單驗(yàn)證)
<template>
<el-upload
action="/api/upload"
list-type="picture-card"
:file-list="fileList"
:on-preview="handlePreview"
:on-remove="handleRemove"
:on-success="handleSuccess"
:on-error="handleError"
:before-upload="beforeUpload"
:limit="3"
:on-exceed="handleExceed"
accept="image/*"
>
<i class="el-icon-plus"></i>
<template #tip>
<div class="el-upload__tip">
只能上傳jpg/png文件,且不超過500KB
</div>
</template>
</el-upload>
</template>
<script setup>
import { ref } from 'vue';
import { ElMessage } from 'element-plus';
const fileList = ref([]);
const handlePreview = (file) => {
console.log('預(yù)覽:', file);
};
const handleRemove = (file, files) => {
console.log('移除:', file, files);
};
const handleSuccess = (response, file, files) => {
ElMessage.success('上傳成功');
console.log('成功:', response, file, files);
};
const handleError = (err, file, files) => {
ElMessage.error('上傳失敗');
console.error('失敗:', err, file, files);
};
const beforeUpload = (file) => {
const isJPGorPNG = file.type === 'image/jpeg' || file.type === 'image/png';
const isLt500KB = file.size / 1024 < 500;
if (!isJPGorPNG) {
ElMessage.error('只能上傳JPG/PNG格式的圖片!');
return false;
}
if (!isLt500KB) {
ElMessage.error('圖片大小不能超過500KB!');
return false;
}
return true;
};
const handleExceed = (files, fileList) => {
ElMessage.warning(`最多只能上傳3張圖片,您選擇了${files.length}張,共${files.length + fileList.length}張`);
};
</script>
<style>
.el-upload__tip {
margin-top: 7px;
color: #666;
font-size: 12px;
}
</style>
4. 手動(dòng)上傳實(shí)現(xiàn)
如果需要手動(dòng)控制上傳時(shí)機(jī):
<template>
<el-upload
ref="uploadRef"
action="/api/upload"
:auto-upload="false"
:file-list="fileList"
:on-success="handleSuccess"
>
<template #trigger>
<el-button type="primary">選擇文件</el-button>
</template>
<el-button type="success" @click="submitUpload">開始上傳</el-button>
</el-upload>
</template>
<script setup>
import { ref } from 'vue';
const uploadRef = ref();
const fileList = ref([]);
const submitUpload = () => {
uploadRef.value.submit();
};
const handleSuccess = (response) => {
console.log('上傳成功:', response);
};
</script>
5. 自定義上傳實(shí)現(xiàn)
如果需要完全自定義上傳邏輯(如使用axios):
<template>
<el-upload
action="#"
:http-request="customRequest"
:file-list="fileList"
>
<el-button type="primary">點(diǎn)擊上傳</el-button>
</el-upload>
</template>
<script setup>
import { ref } from 'vue';
import axios from 'axios';
const fileList = ref([]);
const customRequest = async (options) => {
const { file, onProgress, onSuccess, onError } = options;
const formData = new FormData();
formData.append('file', file);
try {
const res = await axios.post('/api/upload', formData, {
onUploadProgress: (progressEvent) => {
const percent = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
onProgress({ percent });
}
});
onSuccess(res.data);
} catch (err) {
onError(err);
}
};
</script>
6. 常見問題解決方案
問題1: 如何獲取上傳后的文件URL?
在on-success回調(diào)中,服務(wù)器應(yīng)返回文件訪問URL,然后可以存儲(chǔ)到fileList中:
const handleSuccess = (response, file) => {
file.url = response.url; // 假設(shè)服務(wù)器返回{url: '...'}
};
問題2: 如何限制文件大小和類型?
使用before-upload鉤子:
const beforeUpload = (file) => {
const isImage = file.type.startsWith('image/');
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isImage) {
ElMessage.error('只能上傳圖片!');
return false;
}
if (!isLt2M) {
ElMessage.error('圖片大小不能超過2MB!');
return false;
}
return true;
};
問題3: 如何顯示上傳進(jìn)度?
組件內(nèi)置了進(jìn)度條顯示,也可以通過on-progress回調(diào)自定義處理:
:on-progress="handleProgress"
const handleProgress = (event, file, fileList) => {
console.log('上傳進(jìn)度:', event.percent);
};
7. 最佳實(shí)踐建議
服務(wù)器響應(yīng)格式:保持一致的響應(yīng)格式,如{code: 200, data: {url: '...'}, message: 'success'}
安全考慮:
- 后端應(yīng)驗(yàn)證文件類型(不能僅依賴前端驗(yàn)證)
- 對(duì)上傳文件進(jìn)行病毒掃描
- 限制上傳文件大小
用戶體驗(yàn):
- 提供清晰的錯(cuò)誤提示
- 顯示上傳進(jìn)度
- 對(duì)于大文件,考慮分片上傳
性能優(yōu)化:
- 圖片上傳前可進(jìn)行壓縮
- 使用CDN加速上傳
通過以上配置和方法,你可以靈活地實(shí)現(xiàn)各種圖片上傳需求。根據(jù)實(shí)際項(xiàng)目情況選擇最適合的實(shí)現(xiàn)方式。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- ElementPlus函數(shù)式彈窗調(diào)用的實(shí)現(xiàn)
- elementplus+splitpanes實(shí)現(xiàn)左右拖動(dòng)控制寬度的項(xiàng)目實(shí)踐
- Vue3+elementPlus中 樹形控件封裝的實(shí)現(xiàn)
- Vue3+ElementPlus在el-table表格中顯示時(shí)間的示例代碼
- Vue3 + ElementPlus動(dòng)態(tài)合并數(shù)據(jù)相同的單元格的完整代碼
- vue3 + ElementPlus 封裝列表表格組件包含分頁
- vue3+ElementPlus+VueCropper實(shí)現(xiàn)上傳圖片功能
相關(guān)文章
詳解如何實(shí)現(xiàn)Element樹形控件Tree在懶加載模式下的動(dòng)態(tài)更新
這篇文章主要介紹了詳解如何實(shí)現(xiàn)Element樹形控件Tree在懶加載模式下的動(dòng)態(tài)更新,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
Vue.js實(shí)現(xiàn)移動(dòng)端短信驗(yàn)證碼功能
現(xiàn)在的短信驗(yàn)證碼一般為4位或6位,則頁面中會(huì)相應(yīng)的顯示4個(gè)或6個(gè)文本框.好多網(wǎng)站需求都有此功能,今天小編給大家分享基于vue.js實(shí)現(xiàn)移動(dòng)端短信驗(yàn)證碼功能,需要的朋友參考下吧2017-03-03
el-select 點(diǎn)擊按鈕滾動(dòng)到選擇框頂部的實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家分享el-select 點(diǎn)擊按鈕滾動(dòng)到選擇框頂部效果,主要代碼是在visibleChange在這個(gè)popper里面找到.el-select-dropdown__list,感興趣的朋友跟隨小編一起看看吧2024-05-05
Vue路由跳轉(zhuǎn)傳參后無法清空地址欄參數(shù)問題解決方案
這篇文章主要介紹了Vue路由跳轉(zhuǎn)傳參后無法清空地址欄參數(shù)問題解決方案,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-05-05
基于Vue3實(shí)現(xiàn)一鍵復(fù)制圖片到剪貼板功能
日常開發(fā)后臺(tái)管理系統(tǒng)時(shí),經(jīng)常會(huì)遇到附件或者圖片一鍵復(fù)制、直接粘貼到本地或者聊天窗口的需求,本文將基于Vue3?+?Element?Plus?+?Clipboard?API實(shí)現(xiàn)點(diǎn)擊按鈕復(fù)制服務(wù)器圖片到系統(tǒng)剪貼板,有需要的可以了解下2026-04-04
vue3中使用v-model實(shí)現(xiàn)父子組件數(shù)據(jù)同步的三種方案
這篇文章主要介紹了vue3中使用v-model實(shí)現(xiàn)父子組件數(shù)據(jù)同步的三種方案,如果只有一個(gè)匿名v-model的傳遞的話,可以使用vue3.3新添加的編譯宏,defineModel來使用,每種方案結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Element UI 自定義正則表達(dá)式驗(yàn)證方法
今天小編就為大家分享一篇Element UI 自定義正則表達(dá)式驗(yàn)證方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09

