Element Plus上传图片前,对图片进行压缩

在使用 Element Plus(一个基于 Vue 3 的现代组件库)进行文件上传时,你可能希望在上传图片之前对其进行压缩以减少文件大小,从而提高上传速度和节省存储空间。为了实现这一功能,你可以结合使用 JavaScript 库来处理图片的压缩。

下面是一个简单的示例,展示如何在 Element Plus 中使用 compressorjs 进行图片压缩:

  1. 安装必要的依赖:
    首先需要安装 compressorjs,可以通过 npm 或 yarn 安装:

    npm install --save compressorjs
    # 或者
    yarn add compressorjs
    
  2. 导入并使用 Compressor:
    在你的 Vue 组件中导入 Compressor 并使用它来压缩图片文件。

  3. 定义一个上传方法:
    在 Vue 组件的方法中定义一个用于处理文件选择的函数,并在其中调用压缩逻辑。

下面是一个具体的 Vue 3 + Element Plus 的示例代码:

<template>
	<el-upload
		ref="upload"
		class="upload-btn"
		action="api/user/uploadAvatar"
		:on-success="excelUploadSuccess"
		:on-error="excelUploadError"
		:on-change="filehandleChange"
		:before-upload="compressImage"
		:auto-upload="false"
		:show-file-list="false"
	>
		<template #trigger>
			<el-avatar :src="imgurl" size="large" />
		</template>
	</el-upload>
</template>

<script setup lang="ts">
import { ref } from "vue";
import { ElMessage, ElNotification, UploadInstance, UploadProps, UploadRawFile, genFileId } from "element-plus";
import Compressor from "compressorjs";

const upload = ref<UploadInstance>();
const emits = defineEmits(["uploaded"]);

const props = defineProps({
	src: {
		type: String,
		default: ""
	}
});

const imgurl = ref(props.src);

function compressImage(file: any) {
	return new Promise((resolve, reject) => {
		new Compressor(file, {
			quality: 0.9,
			success(result) {
				// 压缩成功后的处理
				const compressedFile = new File([result], file.name, { type: result.type });
				// 可以在这里预览、上传或者做其他处理
				console.log("Compressed file:", compressedFile);
				// 如果需要上传,可以在这里执行上传操作
				resolve(compressedFile);
			},
			error(err) {
				reject("压缩失败");
				console.log("Compressor error:", err.message);
			}
		});
	});
}

const filehandleChange = (file: any, fileList: any) => {
	const fileSuffix = file.name.substring(file.name.lastIndexOf(".") + 1);
	const whiteList = ["jpg", "jpeg", "png"];
	const isSuffix = whiteList.indexOf(fileSuffix.toLowerCase()) === -1;
	const isLt2M = file.size / 1024 / 1024 > 2;
	let msg;
	if (isSuffix) {
		msg = "上传图片只能是 'jpg','jpeg', 'png'格式";
	}
	if (isLt2M) {
		msg = "上传文档大小不能超过 2MB";
	}
	if (msg) {
		ElMessage({
			type: "error",
			message: msg
		});
		upload.value!.clearFiles();
		return;
	}
	upload.value!.submit();
};

// 上传错误提示
const excelUploadError = (): void => {
	upload.value!.clearFiles();
	ElMessage({
		message: "上传失败!",
		type: "error"
	});
};
// 上传成功提示
const excelUploadSuccess = (response: any): void => {
	upload.value!.clearFiles();
	ElMessage({
		message: "上传成功!",
		type: "success"
	});
	imgurl.value = "/api/fileMgr/download?token=" + response.data;
	emits("uploaded", response);
};
</script>
<style lang="scss" scoped>
.upload-btn {
	display: inline-block;
	vertical-align: middle;
	margin-left: 10px;
}
</style>

在这个示例中,我们首先检查用户是否选择了图片文件。如果是,则使用 Compressor 对其进行压缩。压缩完成后,可以进行预览、上传等操作。

compressorjs基本用法

创建一个新的 Compressor 实例,并传递给它一个文件对象以及一些配置选项:

import Compressor from 'compressorjs';
new Compressor(file, options, callback);
  • file: 要压缩的文件对象。
  • options:
    • quality: 压缩质量,默认值为 0.6。对于 JPEG 图像,较低的值会导致更小的文件大小但画质较差;对于 PNG 图像,建议使用 1 来保持透明度。
    • maxWidth: 最大宽度,默认为 1600
    • maxHeight: 最大高度,默认为 1600
    • resize: 是否自动调整尺寸,默认为 true
    • mimeType: 输出文件的 MIME 类型,默认为原文件类型。
    • convertSize: 将文件转换为小于指定大小的字节数,默认为 Infinity
    • rotate: 自动旋转图片,根据 EXIF 数据,默认为 false
  • callback: 一个可选的回调函数,当压缩完成时会被调用。

注意事项

  • 对于 PNG 文件,特别是那些具有透明背景的图片,建议将 quality 设置为 1 以保持透明度。
  • 根据你的需求调整 maxWidthmaxHeight,以确保图片不会过大。
  • 如果你想要上传压缩后的图片,可以在 success 回调中处理上传逻辑。
  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Element Plus 来实现在你的应用程序中上传图片的功能。下面是一个简单的示例代码: 首先,确保你已经正确导入了 Element Plus 组件: ```javascript import { ElUpload } from 'element-plus'; ``` 然后,在你的模板中使用 `ElUpload` 组件来创建一个上传图片的区域: ```html <template> <el-upload action="/your-upload-url" :on-success="handleSuccess" :before-upload="beforeUpload" :auto-upload="false" > <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2MB</div> </el-upload> </template> ``` 在上述代码中,`action` 属性指定了上传图片的后端接口地址,你需要将它替换为你自己的地址。`on-success` 属性指定了上传成功时的回调函数,你可以在这里执行上传成功后的逻辑。`before-upload` 属性可以用来进行一些额外的上传的验证,比如文件类型、大小等。`auto-upload` 属性设为 `false` 可以实现手动触发上传。 最后,在你的 Vue 组件中定义相应的方法: ```javascript methods: { handleSuccess(response, file, fileList) { console.log(response); // 在这里处理上传成功后的逻辑 }, beforeUpload(file) { const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG) { this.$message.error('只能上传jpg/png文件!'); } if (!isLt2M) { this.$message.error('文件大小不能超过2MB!'); } return isJPG && isLt2M; } } ``` 在 `handleSuccess` 方法中,你可以根据后端返回的响应进行进一步的处理,比如展示上传成功的图片或者更新数据。 以上是一个简单的示例,你可以根据自己的需求进行修改和扩展。希望能对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值