图片压缩JS库 Compressorjs 的简单使用示例
一、安装
- npm
npm install compressorjs
- yarn
yarn add compressorjs
二、使用
示例使用阿里云OSS上传
- 在Vant项目中使用
<template>
<van-uploader
v-model="uploadImage"
:max-count="uploadConfig.maxCount"
:max-size="uploadConfig.maxSize"
@oversize="onOversize"
:after-read="onAfterRead"
:before-read="onBeforeRead"
/>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { showToast } from 'vant';
import OSS from 'ali-oss'
import Compressorjs from 'compressorjs';
//阿里云OSS配置
const ossClient = new OSS({
region: 'region',
accessKeyId: 'accessKeyId',
accessKeySecret: 'accessKeySecret',
stsToken: 'stsToken',
bucket: 'bucket'
})
//上传配置
const uploadConfig = reactive({
//最大上传数量
maxCount: 1,
//文件上传大小限制, 2M
maxSize: 2 * 1024 * 1024,
//上传域名
host: 'https://xxx.com'
});
//上传数据
const uploadImage = ref([])
//上传前事件
const onBeforeRead = (file) => {
return new Promise((resolve, reject) => {
new Compressorjs(file, {
//压缩质量, 0-1
quality: 0.6,
//转换的类型,默认为 image/png
convertTypes: ['image/jpeg'],
//需要压缩的起始大小,默认5M, 5 * 1000 * 1000
convertSize: 5000000,
//压缩成功后处理
success(result) {
resolve(result);
},
error(err) {
console.log(err.message);
reject()
},
});
});
}
//读取文件成功后处理
const onAfterRead = (obj) => {
onUpload(obj, result => {
//上传后处理
})
}
//上传
const onUpload = (obj, callback) => {
obj.status = 'uploading';
obj.message = '上传中...';
//文件名
let fileName = obj.file.name;
//上传到服务器
ossClient.multipartUpload(fileName, obj.file, {
progress: function (p) {
//获取进度条的值
if (p == 1) {
//关闭loading加载
closeToast()
}
}
}).then(result => {
obj.serviceUrl = uploadConfig.host + result.name
obj.status = 'done';
obj.message = '上传成功';
if(callback) {
callback(obj)
}
}).catch(err => {
console.log("err:", err)
obj.status = 'failed';
obj.message = '上传失败';
if(callback) {
callback(obj)
}
})
}
//超出文件大小限制处理
const onOverSize = () => {
showToast('超出文件大小限制!')
}
</script>
- 在Element-plus中使用
<template>
<el-upload
action="#"
:file-list="uploadImage"
:limit="uploadConfig.maxCount"
:max-size="uploadConfig.maxSize"
:on-exceed="onExceed"
:http-request="onHttpRequest"
:before-upload="onBeforeUpload"
:on-success="onSuccess"
/>
</template>
<script setup>
import { reactive, ref } from 'vue';
import { ElMessage, ElLoadingService } from 'element-plus';
import OSS from 'ali-oss'
import Compressorjs from 'compressorjs';
//阿里云OSS配置
const ossClient = new OSS({
region: 'region',
accessKeyId: 'accessKeyId',
accessKeySecret: 'accessKeySecret',
stsToken: 'stsToken',
bucket: 'bucket'
})
//上传配置
const uploadConfig = reactive({
//最大上传数量
maxCount: 1,
//文件上传大小限制, 2M
maxSize: 2 * 1024 * 1024,
//上传域名
host: 'https://xxx.com'
});
//上传数据
const uploadImage = ref([])
//上传前事件
const onBeforeUpload = (file) => {
return new Promise((resolve, reject) => {
new Compressorjs(file, {
//压缩质量, 0-1
quality: 0.6,
//转换的类型,默认为 image/png
convertTypes: ['image/jpeg'],
//需要压缩的起始大小,默认5M, 5 * 1000 * 1000
convertSize: 5000000,
//压缩成功后处理
success(result) {
resolve(result);
},
error(err) {
console.log(err.message);
reject()
},
});
});
}
//上传请求
const onHttpRequest = (options) => {
//文件名
let fileName = options.file.name;
//设置文件上传后的名称
options.file.url = uploadConfig.host + fileName;
let loading = ElLoadingService({
message: 'Loading'
})
//上传到服务器
return ossClient.multipartUpload(fileName, options.file, {
progress: function (p) {
//获取进度条的值
if (p == 1) {
//关闭loading加载
loading.close();
}
}
})
}
//上传成功
const onSuccess = (response, uploadFile, uploadFiles) => {
console.log(uploadFile.raw.url)
}
//超出文件大小限制处理
const onExceed = () => {
ElMessage.error('超出文件大小限制!')
}
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律