|
|
@@ -11,21 +11,20 @@
|
|
|
name="file"
|
|
|
:on-remove="handleRemove"
|
|
|
:show-file-list="true"
|
|
|
-
|
|
|
:file-list="fileList"
|
|
|
:on-preview="handlePictureCardPreview"
|
|
|
:class="{hide: this.fileList.length >= this.limit}"
|
|
|
>
|
|
|
<i class="el-icon-plus"></i>
|
|
|
</el-upload>
|
|
|
-
|
|
|
+
|
|
|
<!-- 上传提示 -->
|
|
|
- <div class="el-upload__tip" slot="tip" v-if="showTip">
|
|
|
- 请上传
|
|
|
- <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
|
|
|
- <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
|
|
|
- 的文件
|
|
|
- </div>
|
|
|
+ <!-- <div class="el-upload__tip" slot="tip" v-if="showTip">
|
|
|
+ 请上传
|
|
|
+ <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
|
|
|
+ <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
|
|
|
+ 的文件
|
|
|
+ </div> -->
|
|
|
|
|
|
<el-dialog
|
|
|
:visible.sync="dialogVisible"
|
|
|
@@ -44,18 +43,20 @@
|
|
|
<script>
|
|
|
import { getToken } from "@/utils/auth";
|
|
|
|
|
|
+import { Loading } from 'element-ui';
|
|
|
+
|
|
|
export default {
|
|
|
props: {
|
|
|
value: [String, Object, Array],
|
|
|
// 图片数量限制
|
|
|
limit: {
|
|
|
type: Number,
|
|
|
- default: 5,
|
|
|
+ default: 10,
|
|
|
},
|
|
|
// 大小限制(MB)
|
|
|
fileSize: {
|
|
|
- type: Number,
|
|
|
- default: 5,
|
|
|
+ type: Number,
|
|
|
+ default: 500,
|
|
|
},
|
|
|
// 文件类型, 例如['png', 'jpg', 'jpeg']
|
|
|
fileType: {
|
|
|
@@ -70,11 +71,12 @@ export default {
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
+ finalQuality:1,
|
|
|
dialogImageUrl: "",
|
|
|
dialogVisible: false,
|
|
|
hideUpload: false,
|
|
|
baseUrl: process.env.VUE_APP_BASE_API,
|
|
|
- uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/uploadOSS", // 上传的图片服务器地址
|
|
|
+ uploadImgUrl: process.env.VUE_APP_BASE_API+"/common/uploadOSS", // 上传的图片服务器地址
|
|
|
headers: {
|
|
|
Authorization: "Bearer " + getToken(),
|
|
|
},
|
|
|
@@ -91,9 +93,9 @@ export default {
|
|
|
this.fileList = list.map(item => {
|
|
|
if (typeof item === "string") {
|
|
|
if (item.indexOf(this.baseUrl) === -1) {
|
|
|
- item = { name: this.baseUrl + item, url: this.baseUrl + item };
|
|
|
+ item = { name: item, url: item };
|
|
|
} else {
|
|
|
- item = { name: item, url: item };
|
|
|
+ item = { name: item, url: item };
|
|
|
}
|
|
|
}
|
|
|
return item;
|
|
|
@@ -124,6 +126,7 @@ export default {
|
|
|
},
|
|
|
// 上传成功回调
|
|
|
handleUploadSuccess(res) {
|
|
|
+ console.log(res)
|
|
|
this.fileList.push({ name: res.url, url: res.url });
|
|
|
this.$emit("input", this.listToString(this.fileList));
|
|
|
this.loading.close();
|
|
|
@@ -151,17 +154,99 @@ export default {
|
|
|
);
|
|
|
return false;
|
|
|
}
|
|
|
- if (this.fileSize) {
|
|
|
- const isLt = file.size / 1024 / 1024 < this.fileSize;
|
|
|
- if (!isLt) {
|
|
|
- this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
|
|
|
- return false;
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ if (file.size / 1024 / 1024 > 3) {
|
|
|
+ this.$message.error('上传的图片不能超过3MB');
|
|
|
+ reject();
|
|
|
+ return;
|
|
|
}
|
|
|
- }
|
|
|
- this.loading = this.$loading({
|
|
|
- lock: true,
|
|
|
- text: "上传中",
|
|
|
- background: "rgba(0, 0, 0, 0.7)",
|
|
|
+ if (file.size / 1024 / 1024 > 1) {
|
|
|
+ const loadingInstance = Loading.service({ text: '图片内存过大正在压缩图片...' });
|
|
|
+ // 文件大于1MB时进行压缩
|
|
|
+ this.compressImage(file).then((compressedFile) => {
|
|
|
+ loadingInstance.close();
|
|
|
+ if (compressedFile.size / 1024 > 1000) {
|
|
|
+ this.$message.error('图片压缩后仍大于1000KB');
|
|
|
+ reject();
|
|
|
+ } else {
|
|
|
+ // this.$message.success(`图片压缩成功,最终质量为: ${this.finalQuality.toFixed(2)}`);
|
|
|
+ console.log(`图片压缩成功,最终质量为: ${this.finalQuality.toFixed(2)}`);
|
|
|
+ console.log(`最终内存大小为: ${(compressedFile.size/1024).toFixed(2)}KB`);
|
|
|
+ resolve(compressedFile);
|
|
|
+ }
|
|
|
+ }).catch((err) => {
|
|
|
+ loadingInstance.close();
|
|
|
+ console.error(err);
|
|
|
+ reject();
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ resolve(file);
|
|
|
+ }
|
|
|
+ this.loading = this.$loading({
|
|
|
+ lock: true,
|
|
|
+ text: "上传中",
|
|
|
+ background: "rgba(0, 0, 0, 0.7)",
|
|
|
+ });
|
|
|
+ });
|
|
|
+ // if (this.fileSize) {
|
|
|
+ // const isLt = file.size / 1024 < this.fileSize;
|
|
|
+ // if (!isLt) {
|
|
|
+ // this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} KB!`);
|
|
|
+ // return false;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+
|
|
|
+ },
|
|
|
+ compressImage(file) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const reader = new FileReader();
|
|
|
+ reader.readAsDataURL(file);
|
|
|
+ reader.onload = (event) => {
|
|
|
+ const img = new Image();
|
|
|
+ img.src = event.target.result;
|
|
|
+ img.onload = () => {
|
|
|
+ const canvas = document.createElement('canvas');
|
|
|
+ const ctx = canvas.getContext('2d');
|
|
|
+ const width = img.width;
|
|
|
+ const height = img.height;
|
|
|
+ canvas.width = width;
|
|
|
+ canvas.height = height;
|
|
|
+ ctx.drawImage(img, 0, 0, width, height);
|
|
|
+
|
|
|
+ let quality = 1; // 初始压缩质量
|
|
|
+ let dataURL = canvas.toDataURL('image/jpeg', quality);
|
|
|
+
|
|
|
+ // 逐步压缩,直到图片大小小于500KB并且压缩质量不再降低
|
|
|
+ while (dataURL.length / 1024 > 500 && quality > 0.1) {
|
|
|
+ quality -= 0.01;
|
|
|
+ dataURL = canvas.toDataURL('image/jpeg', quality);
|
|
|
+ }
|
|
|
+ this.finalQuality = quality; // 存储最终的压缩质量
|
|
|
+
|
|
|
+ if (dataURL.length / 1024 > 1000) {
|
|
|
+ reject(new Error('压缩后图片仍然大于1000KB'));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const arr = dataURL.split(',');
|
|
|
+ const mime = arr[0].match(/:(.*?);/)[1];
|
|
|
+ const bstr = atob(arr[1]);
|
|
|
+ let n = bstr.length;
|
|
|
+ const u8arr = new Uint8Array(n);
|
|
|
+ while (n--) {
|
|
|
+ u8arr[n] = bstr.charCodeAt(n);
|
|
|
+ }
|
|
|
+ const compressedFile = new Blob([u8arr], { type: mime });
|
|
|
+ compressedFile.name = file.name;
|
|
|
+ resolve(compressedFile);
|
|
|
+ };
|
|
|
+ img.onerror = (error) => {
|
|
|
+ reject(error);
|
|
|
+ };
|
|
|
+ };
|
|
|
+ reader.onerror = (error) => {
|
|
|
+ reject(error);
|
|
|
+ };
|
|
|
});
|
|
|
},
|
|
|
// 文件个数超出
|
|
|
@@ -178,6 +263,7 @@ export default {
|
|
|
},
|
|
|
// 预览
|
|
|
handlePictureCardPreview(file) {
|
|
|
+ console.log(file)
|
|
|
this.dialogImageUrl = file.url;
|
|
|
this.dialogVisible = true;
|
|
|
},
|
|
|
@@ -196,17 +282,17 @@ export default {
|
|
|
<style scoped lang="scss">
|
|
|
// .el-upload--picture-card 控制加号部分
|
|
|
::v-deep.hide .el-upload--picture-card {
|
|
|
- display: none;
|
|
|
+ display: none;
|
|
|
}
|
|
|
// 去掉动画效果
|
|
|
::v-deep .el-list-enter-active,
|
|
|
::v-deep .el-list-leave-active {
|
|
|
- transition: all 0s;
|
|
|
+ transition: all 0s;
|
|
|
}
|
|
|
|
|
|
::v-deep .el-list-enter, .el-list-leave-active {
|
|
|
- opacity: 0;
|
|
|
- transform: translateY(0);
|
|
|
+ opacity: 0;
|
|
|
+ transform: translateY(0);
|
|
|
}
|
|
|
</style>
|
|
|
|