tzs
tzs
侠客
侠客
  • 最后登录2023-07-24
  • 发帖数12
阅读:3317回复:0

[vue]vue实现图片上传

楼主#
更多 发布于:2023-04-13 20:26
<template>
  <div class="app-container">


    <el-tooltip slot="left" class="item" effect="dark" content="点击查看效果" placement="top-start">
      <el-button size="mini" type="primary" icon="el-icon-edit" @click="openModel"/>
    </el-tooltip>


    <!--表单组件-->
    <el-dialog
      :close-on-click-modal="true"
      :close-on-press-escape="true"
      :visible.sync="modelFlag"
      title="model弹框"
      width="50%"
      :fullscreen="false"
    >
      <el-form ref="formData" :inline="true" :model="formData" size="small"
               label-width="140px">
        <el-form-item label="file1" style="width: 500px;">
          <el-upload
            class="avatar-uploader"
            name="file"
            :action="uploadUrl"
            list-type="picture"
            :show-file-list="false"
            :on-preview="(file)=>handlePreview(file,'file1')"
            :on-remove="(file,fileList)=>handleRemove(file,fileList,'file1')"
            :on-success="(response, file)=> handleUploadSuccess(response, file,'file1')"
            :before-upload="beforeUpload"
          >
            <el-tooltip class="item" effect="dark" content="点击修改附件" placement="right">
              <img style="width: 250px;height:120px" v-if="formData.file1" :src="formData.file1" class="avatar" alt="">
              <i v-else class="el-icon-plus avatar-uploader-icon"></i>
            </el-tooltip>
          </el-upload>
        </el-form-item>


        <!--第一种方式:点击右下角加号会放大图片-->
        <el-image v-show="formData.file1"
                  @click.native="handleClickItem"
                  src="https://img0.baidu.com/it/u=1713870962,188032507&fm=26&fmt=auto&gp=0.jpg"
                  :preview-src-list="[formData.file1]"
                  fit="fill"
                  class="el-avatar"
        />


        <el-divider></el-divider>
        <el-form-item label="file2" style="width: 500px;">
          <el-upload
            class="avatar-uploader"
            style="width: 250px;height:130px"
            :action="uploadUrl"
            :on-preview="(file)=>handlePreview(file,'file2')"
            :on-remove="(file,fileList)=>handleRemove(file,fileList,'file2')"
            :on-change="handleChange"
            :on-success="(response, file)=> handleUploadSuccess(response, file,'file2')"
            :file-list="showFileList.file2"
            :before-upload="beforeUpload"
            :limit="parseInt(1)"
            list-type="picture">


            <el-button v-show="formData.file2 === null || formData.file2 === ''" size="small" type="primary">
              点击上传
            </el-button>
          </el-upload>
        </el-form-item>
        <!--第二种方式:点击图片会放大预览图片-->
        <el-image-viewer v-if="file2BigFlag"
                         :on-close="()=>closePicturePreview('file2')"
                         @click.native="handleClickItem"
                         :url-list="[formData.file2]"/>


      </el-form>


      <div slot="footer" class="dialog-footer">
        <el-button type="success" @click="closeModel">取消</el-button>
        <el-button type="primary" @click="confirmSubmit">确认</el-button>
      </div>
    </el-dialog>
  </div>
</template>


<script>


import apis from '@/store/modules/api'
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'


export default {
  name: 'ImageFileUpload',
  components: {ElImageViewer},


  data() {
    return {
      modelFlag: false,
      formData: {
        //表单里附件数据
        'file1': null,
        'file2': null,
      },
      //附件展示(这里列表需要展示name和url属性,这里单独维护,方便处理)
      showFileList: {},


      //预览大图片标识,一般附件列表展示的看不清楚,会对图片进行放大处理
      file1BigFlag: false,
      file2BigFlag: false,


      //上传附件的url地址
      uploadUrl: `url`,
    }
  },


  methods: {
    /**
     * 打开model框,获取数据并赋值展示的附件列表
     */
    openModel(params) {
      //获取数据源
      this.formData.file1 = 'https://img0.baidu.com/it/u=3153405721,1524067674&fm=26&fmt=auto&gp=0.jpg';
      this.formData.file2 = 'https://img1.baidu.com/it/u=1474266791,210202337&fm=26&fmt=auto&gp=0.jpg';


      if (this.formData.file2) {
        this.showFileList.file2 = [{name: 'file2.jpeg', url: this.formData.file2}]
      }


      this.modelFlag = true
    },


    closeModel() {
      this.modelFlag = false
    },


    confirmSubmit() {
      this.$confirm('您确认提交吗?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        console.log(JSON.stringify(this.formData))
      }).catch(() => {


      })
    },


    /**
     * 附件上传成功后的处理
     */
    handleUploadSuccess(res, file, type) {
      if (type && type === 'file2') {
        this.formData.file2 = res.data.url
        //附件展示
        this.showFileList.file2 = [{name: 'file2.jpeg', url: this.formData.file2}]
      } else if (type && type === 'file1') {
        this.formData.file1 = res.data.url
        this.showFileList.file1 = [{name: 'file1.jpeg', url: this.formData.file1}]
      }
    },


    /**
     * 附件上传前的前置校验
     * @param file
     * @returns {boolean}
     */
    beforeUpload(file) {
      const fileTypeFlag = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg'
      const fileTenM = file.size / 1024 / 1024 < 10


      if (!fileTypeFlag) {
        this.$message.error('上传附件格式只支持png、jpg、jpeg类型!')
      }
      if (!fileTenM) {
        this.$message.error('上传附件大小不能超过10MB!')
      }
      return fileTypeFlag && fileTenM
    },


    handleRemove(file, fileList, type) {
      //这个方法在上传文件时也会触发,所以这里做一下判断,只有主动删除文件才会触发
      if (file && file.status && file.status === 'ready') {
        return
      }


      if (type && type === 'file2') {
        this.formData.file2 = null
        this.showFileList.file2 = []
      } else if (type && type === 'file1') {
        this.formData.file1 = null
        this.showFileList.file1 = []
      }
    },


    /**
     * 点击文件列表中已上传的文件时的钩子(预览大图)
     */
    handlePreview(file, type) {
      if (type && type === 'file2') {
        this.file2BigFlag = true
      } else if (type && type === 'file1') {
        this.file1BigFlag = true
      }
    },


    /**
     * 预览图片关闭时事件
     */
    closePicturePreview(type) {
      if (type && type === 'file2') {
        this.file2BigFlag = false
      } else if (type && type === 'file1') {
        this.file1BigFlag = false
      }
    },


    handleChange(file) {
      console.log('handleChange' + file)
    },


    /**
     * 用户点击遮罩层关闭预览大图也是习惯性的常规操作,但 elementUI 并没有支持。
     两种思路:
     1、把hide事件绑定在遮罩层 dom
     2、直接调用 关闭按钮 上的 click 事件
     获取遮罩层dom很容易,hide事件就相对麻烦了,需要获取 vue实例子组件 image-viewer,再访问子组件的method。所以我使用了第二种方法
     */
    handleClickItem() {
      this.$nextTick(() => {
        // 获取遮罩层dom
        let domImageMask = document.querySelector('.el-image-viewer__mask')
        if (!domImageMask) {
          return
        }


        // 添加click监听事件,点击遮罩层时调用关闭按钮的 click 事件
        domImageMask.addEventListener('click', () => {
          document.querySelector('.el-image-viewer__close').click()
        })
      })
    },
  }


}
</script>


<style scoped>


/deep/ .el-image-viewer__close {
  color: white;
}


/*控制加号样式*/
/deep/ .el-image {
  width: 25px;
  height: 25px;
}


/*控制预览图片大小*/
/deep/ .el-image-viewer__img {
  height: 400px;
  width: 500px;
}


/deep/ .el-avatar {
  display: flex;
  position: absolute;
  left: 385px;
  top: 175px;
  color: white;
}


/deep/ .el-upload-list--picture {
  margin-top: -30px;
}


/deep/ .el-upload-list--picture .el-upload-list__item.is-success {
  width: 250px;
  height: 120px;
}


/deep/ .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name {
  line-height: 80px;
  margin-top: 0;
  margin-left: 3px;
}


.avatar-uploader-icon {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  position: relative;
  overflow: hidden;
  display: inline-block;
  cursor: pointer;
  outline: white;
  font-size: 40px;
  color: #8c939d;
  width: 60px;
  height: 60px;
}


.el-icon-plus:before {
  text-align: center;
  vertical-align: middle;
}


</style>
转载至:https://blog.csdn.net/smilehappiness/article/details/118423132
游客


返回顶部

公众号

公众号