element-ui图片上传组件使用

300 阅读1分钟

效果图

image.png

代码块

HTML部分

name="scrm-files" 代表发送请求的时候 文件流的参数名

<el-upload
              :action="uploadImgUrl"
              list-type="picture-card"
              :on-success="handleUploadSuccess"
              :before-upload="handleBeforeUpload"
              :limit="limit"
              :on-error="handleUploadError"
              :on-exceed="handleExceed"
              name="scrm-files"
              :on-remove="handleRemove"
              :show-file-list="true"
              :headers="headers"
              :on-preview="handlePictureCardPreview"
              :class="{ hide: this.fileList.length > 0 }"
              ref="upload"
            >
              <i class="el-icon-plus"></i>
</el-upload>

 <!-- 预览弹窗 -->
    <el-dialog :visible.sync="dialogVisible" title="预览" width="800" append-to-body>
      <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" />
    </el-dialog>

js部分

this.$loading() 如果引入了element-ui 就可以使用这个全局的方法 可以调用实现页面加载功能

export default {
	data(){
		return{
			limit: 1,		   // 最大上传数量
			fileSize: 5,	           // 上传图片的最大限制(MB)
			uploadImgUrl: ''           // 上传图片的接口地址
			fileType: ["png", "jpg", "jpeg"], // 上传类型
                        fileList: [],             // 存上传图片的数组
                        dialogVisible: false,
                        dialogImageUrl:'',
			headers:{
				Authorization: getToken(), // 请求头需要带的token
			}
		}
	},
	methods:{
		 // 上传成功回调
    	handleUploadSuccess(res) {
      		this.fileList.push({ name: res.fileName, url: res.data[0] });
      		this.loading.close();
    	},
    	// 上传前loading加载
    	handleBeforeUpload(file) {
      		let isImg = false;
      		if (this.fileType.length) {
        		let fileExtension = "";
        		if (file.name.lastIndexOf(".") > -1) {
          			fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
        		}
        		isImg = this.fileType.some((type) => {
          			if (file.type.indexOf(type) > -1) return true;
          			if (fileExtension && fileExtension.indexOf(type) > -1) return true;
          			return false;
        		});
      		} else {
        		isImg = file.type.indexOf("image") > -1;
      		}
      		if (!isImg) {this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);
        		return false;
      		}
      		if (this.fileSize) {
        		const isLt = file.size / 1024 / 1024 < this.fileSize;
        		if (!isLt) {
          			this.$message.error(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
          			return false;
        		}
      		}
      		this.loading = this.$loading({
        		lock: true,
        		text: "上传中",
        		background: "rgba(0, 0, 0, 0.7)",
      		});
    	},
    	 // 上传失败
    	handleUploadError() {
      		this.$message({
        		type: "error",
        		message: "上传失败",
      		});
      		this.loading.close();
    	},
    	// 文件个数超出
    	handleExceed() {
      		this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`);
    	},
    	// 删除图片
    	handleRemove() {
      		this.fileList = [];
    	},
    	// 预览
    	handlePictureCardPreview(file) {
      		this.dialogImageUrl = file.url;
      		this.dialogVisible = true;
    	},
	}
}

CSS 上传到指定数量时 隐藏上传按钮

这个是你定义的limit来控制隐藏和显示的

::v-deep.hide .el-upload--picture-card { display: none; }

这个就是完整的图片上传功能了 可以拆分组件单独封装多次使用 在上传成功的回调那里写上$emit 把fileList传过去就可以了