首先封装一个上传图片的功能
我起名为MultiUpload.vue
内容如下,运用到了组件库elements,首先要正确安装注册
<template>
<div>
<el-upload
:action="minioUploadUrl"
:headers="headers"
:data="useOss ? dataObj : null"
list-type="picture-card"
:file-list="fileList"
:before-upload="beforeUpload"
:on-remove="handleRemove"
:on-success="handleUploadSuccess"
:on-preview="handlePreview"
:limit="maxCount"
:on-exceed="handleExceed"
:on-error="errorfn"
:on-progress="progressfn"
>
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
import { policy } from "@/api/oss";
export default {
name: "multiUpload",
props: {
//图片属性数组
value: Array,
//最大上传图片数量
maxCount: {
type: Number,
default: 5,
},
},
data() {
return {
headers: {
Authorization: "Bearer " + getToken(),
},
dataObj: {
policy: "",
signature: "",
key: "",
ossaccessKeyId: "",
dir: "",
host: "",
},
dialogVisible: false,
dialogImageUrl: null,
useOss: false, //使用oss->true;使用MinIO->false
ossUploadUrl: "http://macro-oss.oss-cn-shenzhen.aliyuncs.com",
// minioUploadUrl: "http://localhost:8080/minio/upload",
minioUploadUrl: "http://192.168.1.88:8080/file/oss/uploadCarbon",
};
},
computed: {
fileList() {
let fileList = [];
for (let i = 0; i < this.value.length; i++) {
fileList.push({ url: this.value[i] });
}
return fileList;
},
},
methods: {
errorfn(error,event, file) {
console.log('error', error);
console.log("上传失败event",event);
console.log("上传失败file", file);
},
progressfn(event, file) {
console.log(event, file);
},
emitInput(fileList) {
let value = [];
for (let i = 0; i < fileList.length; i++) {
value.push(fileList[i].url);
}
this.$emit("input", value);
},
handleRemove(file, fileList) {
this.emitInput(fileList);
},
handlePreview(file) {
this.dialogVisible = true;
this.dialogImageUrl = file.url;
},
beforeUpload(file) {
let _self = this;
if (!this.useOss) {
//不使用oss不需要获取策略
return true;
}
return new Promise((resolve, reject) => {
policy()
.then((response) => {
_self.dataObj.policy = response.data.policy;
_self.dataObj.signature = response.data.signature;
_self.dataObj.ossaccessKeyId = response.data.accessKeyId;
_self.dataObj.key = response.data.dir + "/${filename}";
_self.dataObj.dir = response.data.dir;
_self.dataObj.host = response.data.host;
resolve(true);
})
.catch((err) => {
console.log(err);
reject(false);
});
});
},
handleUploadSuccess(res, file) {
console.log("上传成功file", file);
console.log("上传成功res", res);
let url = this.dataObj.host + "/" + this.dataObj.dir + "/" + file.name;
if (!this.useOss) {
//不使用oss直接获取图片路径
url = res.url;
}
this.fileList.push({ name: file.name, url: url });
this.emitInput(this.fileList);
},
handleExceed(files, fileList) {
this.$message({
message: "最多只能上传" + this.maxCount + "张图片",
type: "warning",
duration: 1000,
});
},
},
};
</script>
<style></style>
封装之后就可以在项目中使用了,具体的使用方法如下
<el-form-item label="商品相册:">
<multi-upload v-model="selectProductPics"></multi-upload>
</el-form-item>
import MultiUpload from "@/components/Upload/multiUpload";
computed: {
//是否有商品属性图片
hasAttrPic() {
if (this.selectProductAttrPics.length < 1) {
return false;
}
return true;
},
//商品的编号
productId() {
return this.value.id;
},
//商品的主图和画册图片
selectProductPics: {
get: function () {
let pics = [];
if (
this.value.pic === undefined ||
this.value.pic == null ||
this.value.pic === ""
) {
return pics;
}
pics.push(this.value.pic);
if (
this.value.albumPics === undefined ||
this.value.albumPics == null ||
this.value.albumPics === ""
) {
return pics;
}
let albumPics = this.value.albumPics.split(",");
for (let i = 0; i < albumPics.length; i++) {
pics.push(albumPics[i]);
}
return pics;
},
set: function (newValue) {
if (newValue == null || newValue.length === 0) {
this.value.pic = null;
this.value.albumPics = null;
} else {
this.value.pic = newValue[0];
this.value.albumPics = "";
if (newValue.length > 1) {
for (let i = 1; i < newValue.length; i++) {
this.value.albumPics += newValue[i];
if (i !== newValue.length - 1) {
this.value.albumPics += ",";
}
}
}
}
},
},
},
以上是页面部分的使用
按照这样的方式和步骤就可以实现vue项目中上传图片的功能