Element-Plus el-upload 图片上传(缩略图)

        Element-Plus  el-upload 提供了非常方便快捷的图片上传功能,点击或者拖拽上传文件,展示图片缩略图并提供放大镜,下载和删除功能。

官方网站:https://element-plus.org/zh-CN/component/upload.html

效果展示:

效果图一:

未上传图片效果。

效果图二:

点击+加号上传图片后展示缩略图效果。

效果图三:

鼠标移入缩略图图片中出现放大镜、下载和删除工具。

效果图四:

点击放大镜展示预览图片对话框。

代码展示:

图片上传:

<!-- action: 上传图片服务器接口路径
		list-type: 文件列表的类型
		file-list: 上传文件列表
		auto-upload: 自动上传
		headers: 设置上传的请求头
		on-success: 上传成功的回调函数-->
<el-upload action="/api/file/upload" list-type="picture-card" v-model:file-list="fileList"
	:auto-upload="true" :headers="{'Authorization':token}" :on-success="uploadSuccess">
	<el-icon>
		<Plus />
	</el-icon>
	<template #file="{ file }">
		<div>
			<img class="el-upload-list__item-thumbnail" :src="file.url" alt="" />
			<span class="el-upload-list__item-actions">
			<!-- 图片预览 -->
				<span class="el-upload-list__item-preview"
					@click="handlePictureCardPreview(file)">
					<el-icon><zoom-in /></el-icon>
				</span>
				<span class="el-upload-list__item-delete" @click="handleDownload(file)">
					<el-icon>
						<Download />
					</el-icon>
				</span>
				<span class="el-upload-list__item-delete"
					@click="handleRemove(file,fileList)">
					<el-icon>
						<Delete />
					</el-icon>
				</span>
			</span>
		</div>
	</template>	
</el-upload>

图片预览:

<!-- 预览图片 -->
<el-dialog v-model="dialogVisible" width="435px">
	<img w-full :src="dialogImageUrl" width="400px" alt="预览图片" />
</el-dialog>

下载图片JS代码:

如何通过JS代码下载图片?

        1. 获取图片URL
        2. 创建<a>标签设置href为图片的URL
        3. 设置download属性为文件名,指定下载时图片的名称
        4. <a>标签触发下载
        5. 清理DOM,移除不再需要的元素

const handleDownload = (file : UploadFile) => {
		const link = document.createElement('a');
		link.href = file.url;
		link.download = file.name;
		document.body.appendChild(link);
		link.click(); // 模拟点击
		document.body.removeChild(link);  // 下载后移除元素
}

预览图片JS代码:

// 预览图片
const handlePictureCardPreview = (file : UploadFile) => {
	dialogImageUrl.value = file.url!
	dialogVisible.value = true;
};

删除图片JS代码:

循环图片列表,找出与被删除图片相同name的图片下标进行删除。

// 删除图片
const handleRemove = (file, fileList) => {
	for (let i = 0; i < fileList.length; i++) {
		if (fileList[i].name == file.name) {
			fileList.splice(i, 1);
		}
	}
}

上传图片成功回调函数:

const uploadSuccess = ({ data }) => {
	console.log(data);
	// 上传成功后将回调函数返回的图片地址信息存入到数据库中
	changeArticleInfo.value.coverImg = data;
	console.dir(changeArticleInfo.value)
	ElMessage.success('上传成功');
}

### Element Plus Upload 组件实现图片上传 #### 基础配置与功能说明 Element Plus 的 `<el-upload>` 组件提供了丰富的选项来满足不同的需求,例如文件类型限制、文件大小控制以及自定义触发行为等功能[^1]。以下是常见的基础配置参数及其作用: - `action`:指定上传接口地址。 - `accept`:设置允许上传的文件类型(如 `.jpg, .png`)。 - `limit`:限定最多可上传的文件数量。 - `on-exceed`:当超出文件数量限制时调用的方法。 - `before-upload`:在文件上传前执行的操作函数。 #### 示例代码展示 下面是一个完整的 Vue 3 和 Element Plus 集成的例子,用于演示如何使用 `<el-upload>` 来实现图片上传的功能。 ```html <template> <div class="upload-demo"> <el-upload :action="uploadUrl" list-type="picture-card" :file-list="fileList" :on-preview="handlePreview" :on-remove="handleRemove" :before-upload="beforeAvatarUpload" :on-success="handleSuccess" accept=".jpg,.jpeg,.png" multiple limit="3" :on-exceed="handleExceed"> <i class="el-icon-plus"></i> </el-upload> <el-dialog v-model="dialogVisible" title="预览"> <img width="100%" :src="previewImageUrl" alt="" /> </el-dialog> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const uploadUrl = 'https://jsonplaceholder.typicode.com/posts/'; // 替换为实际服务器 URL const fileList = ref([]); const dialogVisible = ref(false); const previewImageUrl = ref(''); const handlePreview = (file) => { previewImageUrl.value = file.url || file.raw; dialogVisible.value = true; }; const handleRemove = (file, fileList) => { console.log('File removed:', file); }; const beforeAvatarUpload = (rawFile) => { if (rawFile.size / 1024 / 1024 > 2) { alert('Image size cannot exceed 2MB!'); return false; } return true; }; const handleSuccess = () => { console.log('Upload successful'); }; const handleExceed = () => { this.$message.warning(`Maximum number of files exceeded`); }; return { uploadUrl, fileList, dialogVisible, previewImageUrl, handlePreview, handleRemove, beforeAvatarUpload, handleSuccess, handleExceed, }; }, }; </script> <style scoped> .upload-demo { margin-top: 20px; } </style> ``` 上述代码展示了如何利用 `<el-upload>` 创建一个带有缩略图显示、文件移除事件处理和文件上传验证的组件。 #### 扩展功能——二次封装 如果希望进一步增强灵活性并减少重复开发工作量,则可以通过二次封装的方式简化业务逻辑[^2]。具体来说,可以创建一个新的 Vue 组件,在其中集成所有的默认属性和回调方法,并暴露必要的 API 接口供外部调用。 #### 解决拖拽问题 某些情况下可能会遇到拖拽上传失败的情况。这通常是因为未正确绑定监听器或者样式冲突引起的。解决方案是在初始化阶段确保 DOM 节点已加载完毕后再挂载相关事件处理器[^3]。 #### 大文件分片上传 对于非常庞大的媒体资源(比如高清 MP4),可以直接采用分片技术将整个数据分割成若干个小部分逐一提交给服务端保存[^4]。这种方式不仅提高了效率还增强了用户体验感。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值