• wangxl's avatar
    333 · cab2e1b4
    wangxl authored
    cab2e1b4
upLoad.vue 4.29 KB
<template>
  <div class="upload-layout">
    <div v-if="file.downloadUrl" class="file-lay">
      <div>
        <document-view :fileUrl="file.downloadUrl" :fileName="file.fileName" :imageArray="[file.downloadUrl]"></document-view>
      </div>
      <a-icon type="delete" class="hover-pointer d-icon" @click="deletefile(file)" style="margin: 0px 2px;" />
    </div>
    <div v-else>
      <a-form-model-item :prop="name+'downloadUrl'" :rules="{required: isRequired, message: message,trigger: 'blur',}">
        <input type="file" ref="fileElem" class="visually-hidden" @change="handleFiles">
        <a-button @click="fileSelect">
          <a-icon type="upload" />选择文件
        </a-button>
      </a-form-model-item>
    </div>
  </div>
</template>
<script>
const File = { fileName: null, downloadUrl: null, fileExplain: null, downloadId: null }
import documentView from '@/views/components/common/documentView'
export default {
  name: "FileUpload",
  components: {
    documentView
  },
  data () {
    return {

    };
  },
  props: {
    file: {
      type: Object,
      default: () => {
        return { ...File }
      }
    },
    isUpload: {
      type: Boolean,
      default () {
        return false
      }
    },
    isRequired: {
      type: Boolean,
      default () {
        return true
      }
    },
    format: {
      type: Array,
      default () {
        return []
      }
    },
    name: {
      type: String,
      default () {
        return 'fileobj'
      }
    },
    message: {
      type: String,
      default () {
        return '请上传附件'
      }
    },
  },
  created () {

  },
  methods: {
    fileSelect () {
      let fileElem = this.$refs['fileElem']
      if (fileElem) {
        fileElem.click()
      }
    },
    handleFiles () {
      let fileElem = this.$refs['fileElem']
      let files = fileElem.files
      if (files.length <= 0) {
        this.$message.error('未选中文件,请尝试重新选择')
        return
      }
      if (!this.fileCheck(files[0]))
        return
      if (this.isUpload) {
        this.$api.base.asyncUpload(this.uploadHandle(files[0], files[0].name)).then(({ data = {} }) => {
          if (data) {
            this.file.fileName = files[0].name
            this.file.downloadId = data.id
            this.file.downloadUrl = data.downloadUrl
          } else
            this.$message.error('上传失败')
        }).catch(() => {
          this.$message.error('上传失败')
        })
      } else {
        this.file.fileName = files[0].name
        this.file.downloadUrl = '/' + files[0].name
        this.$emit("beforeUpload", files[0]);
      }
    },
    fileCheck (file) {
      //判断是否小于1M
      let isLtSize = file.size < 1024 * 1024 * 15;
      if (!isLtSize) {
        this.$message.error('文件大小不能超过15M!');
        return false
      }
      var fileNames = file.name.split('.')
      var fileType = fileNames[fileNames.length - 1].toLocaleLowerCase()
      if (!!this.format && this.format.length > 0) {
        var extList = this.format
        if (!extList.find((item) => item == fileType)) {
          this.$message.error('文件格式错误!')
          return false
        }
      }
      return true
    },
    deletefile () {
      this.$emit("cancel");
      if (this.isUpload) {
        this.$api.base.deletefile({ id: this.file.downloadId }).then(({ data = {} }) => {
          if (data) {
            this.file.fileName = null
            this.file.downloadUrl = null
            this.file.downloadId = null
          }
        }).catch(() => {
          this.$message.error('删除失败')
        })
      } else {
        this.file.fileName = null
        this.file.downloadUrl = null
        this.file.downloadId = null
      }
    },
    uploadHandle (file, fileName) {
      let formData = new FormData()
      formData.append('file', file)
      formData.append('fileName', fileName)
      return formData
    },
    downloadfile () {

    },
  },
  watch: {
    value: {
      handler (value) {

      },
    }
  }
};
</script>
<style scoped lang="less">
.upload-layout {
  width: 100%;
  .file-lay {
    display: flex;
    justify-content: center;
    align-items: center;
    margin: 0 8px;
    > div:nth-child(1) {
      max-width: calc(100% - 0px);
    }
  }
  .visually-hidden {
    display: none !important;
  }
}
</style>