el-upload 上传文件方法

el-upload 上传文件方法

// 第一种方法(发送文件至后台返回URL地址)
<template>
  <div class="addEventDialog">
            <el-upload
              :limit="1"
              :on-exceed="uploadExceed"
              action="https://jsonplaceholder.typicode.com/posts/"
              list-type="picture-card"
              :http-request="uploading"
              :file-list="fileList"
              accept=""
              ref="upload"
            >
              <i class="el-icon-plus"></i>
              <div slot="file" slot-scope="{ file }">
                <img class="el-upload-list__item-thumbnail" style="width: 100%; height: 100%" :src="file | picFilter" />
                <div style="margin-top: -8px">{{ file.name }}</div>
                <span class="el-upload-list__item-actions">
                  <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                    <i class="el-icon-zoom-in"></i>
                  </span>
                  <span class="el-upload-list__item-delete" @click="handleDownload(file)">
                    <i class="el-icon-download"></i>
                  </span>
                  <span class="el-upload-list__item-delete" @click="handleRemove(file)">
                    <i class="el-icon-delete"></i>
                  </span>
                </span>
              </div>
            </el-upload>
  </div>
</template>
<script>
import request from '@/utils/request'
export default {
  name: 'addEventDialog',
  props: ['dialogVisible', 'formInfo', 'isCode'],
  watch: {
    dialogVisible(v) {
      this.dialogVisible = v
      if (v) {
        this.form = Object.assign({}, JSON.parse(JSON.stringify(this.formInfo)))
        if (this.form.file) {
        // 回显文件
          this.files = this.form.file
          this.fileList = this.form.file.split(',').map((item) => {
            return {
              name: item.split('/').pop(),
              percentage: 0,
              raw: File,
              size: 6194,
              status: 'ready',
              uid: item.split('/').pop() + new Date().getTime(),
              url: item
            }
          })
        }
      }
    }
  },
  data() {
    return {
      files: null,
      dialogVisible1: false,
      dialogImageUrl: '',
      fileList: [],
      rules: {},
      loading: false,
      kindList: [],
      typeList: [],
      sourceList: [],
      typeList1: [],
      streetList: [],
      communityList: [],
      videoShow: '',
      addForm: {
        video: ''
      },
      form: {
        department: '',
        person: '',
        dealTime: '',
        feedback: ''
      },
      gpsInfo: '',
      timeout: null,
      videoHidden: false
    }
  },
  filters: {
    picFilter(flie) {
      console.log(flie)
      if (
        flie.name.includes('.jpg') ||
        flie.name.includes('.png') ||
        flie.name.includes('.gif') ||
        flie.name.includes('.bmp') ||
        flie.name.includes('.jpeg') ||
        flie.name.includes('.JPG') ||
        flie.name.includes('.PNG') ||
        flie.name.includes('.GIF') ||
        flie.name.includes('.BMP') ||
        flie.name.includes('.JPEG')
      ) {
        flie.isShow = true
        return flie.url
      } else if (flie.name.includes('.docx')) {
        flie.isShow = false
        return require('../../assets/fileImg.png')
      } else if (flie.name.includes('.pptx')) {
        flie.isShow = false
        return require('../../assets/power.png')
      } else if (flie.name.includes('.xlsx')) {
        flie.isShow = false
        return require('../../assets/excel.png')
      } else if (flie.name.includes('.pdf') || flie.name.includes('.PDF')) {
        flie.isShow = false
        return require('../../assets/pdf.png')
      } else {
        flie.isShow = false
        return require('../../assets/other.png')
      }
    }
  },
  methods: {
    reset() {
      this.loading = false
      this.fileList = []
      this.files = null
      this.form = {}
      // 清空表单校验,避免再次进来会出现上次校验的记录
      this.$refs.formLabel.clearValidate()
    },
    handleOk() {
      this.$refs.formLabel.validate((valid) => {
        if (valid) {
          this.submitAll()
        } else {
          this.$message.warning('检查表单输入内容的合法性!')
          return false
        }
      })
    },
    submitAll() {
      this.loading = true
      let newForm = {
        department: this.form.department
      }
      if (this.files) {
        newForm.file = this.files
      } else {
        newForm.file = null
      }
      let url = ''

      url = '/binhuapis/dapeng/eventTask/edit'
      request.post(url, newForm).then((r) => {
        this.loading = false
        if (r.data.code === 200) {
          this.$message.success('响应成功!')
          this.$emit('success')
          this.reset()
          this.$emit('update:dialogVisible', false)
        } else {
          this.$message.error(r.data.message)
        }
      })
    },
    handleRemove(file) {
      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          let fileUrl = ''
          if (this.fileList && this.fileList.length > 0) {
            console.log(this.fileList, 'this.fileListthis.fileList')
            this.fileList.forEach((item) => {
              if (item.name === file.name) {
                fileUrl = item.url
              } else {
                fileUrl = file.url
              }
            })
          } else {
            fileUrl = file.url
          }
          let url = '/binhuapis/file/delete?url=' + fileUrl
          request.get(url).then((res) => {
            // let arr = this.$refs.upload.uploadFiles
            // let index = arr.indexOf(file)
            // this.files.splice(index, 1)
            // arr.splice(index, 1)
            this.files = null
            this.fileList = []
            this.$message.success('删除成功!')
          })
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          })
        })
    },
    handlePictureCardPreview(file) {
      this.dialogImageUrl = file.url
      this.dialogVisible1 = true
    },
    handleDownload(file) {
      let url2 = file.url.replace(/\\/g, '/')
      let xhr = new XMLHttpRequest()
      xhr.open('GET', url2, true)
      xhr.responseType = 'blob'
      xhr.onload = () => {
        if (xhr.status === 200) {
          this.saveAs(xhr.response, file.name)
        }
      }
      xhr.send()
    },
    saveAs(data, name) {
      let urlObject = window.URL || window.webkitURL || window
      // eslint-disable-next-line camelcase
      let export_blob = new Blob([data])
      // eslint-disable-next-line camelcase
      let save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
      save_link.href = urlObject.createObjectURL(export_blob)
      save_link.download = name
      save_link.click()
    },
    uploading(e) {
      let url = '/binhuapis/file/upload'
      let formData = new FormData()
      formData.append('file ', e.file)
      request
        .post(url, formData)
        .then((res) => {
          if (res.data.code === 200) {
            this.files = res.data.data
            let files = {
              name: e.file.name,
              url: res.data.data
            }
            this.fileList.push(files)
          }
        })
        .catch((e) => {
          this.$message.error(e.response.data.message)
        })
    },
    uploadExceed(file, fileList) {
      this.$message.error('只能上传一个文件')
    }
  }
}
</script>
<style lang="scss">
</style>

// 第二种:发送文件流至后台
  <el-upload
              class="attachmentUpload"
              action="#"
              list-type="picture-card"
              :http-request="uploading"
              :file-list="fileList"
              accept=".jpg, .png, .xlsx, .xlc, .xlm, .xls, .xlt, .xlw, .csv, .doc, .docx, .pdf, .PDF"
              ref="upload"
              :before-upload="beforeAvatarUpload"
              :disabled="attachFilesDisabled"
              :class="objClass"
            >
              <i class="el-icon-plus"></i>
              <div slot="file" slot-scope="{ file }">
                <img
                  class="el-upload-list__item-thumbnail"
                  style="width: 100%; height: 50%; margin-top: 5px; object-fit: contain; object-position: 50% 20%"
                  :src="file | picFilter"
                />
                <div style="margin-top: -10px">{{ file.name }}</div>
                <span class="el-upload-list__item-actions">
                  <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)" v-if="file.isShow">
                    <i class="el-icon-zoom-in"></i>
                  </span>
                  <span class="el-upload-list__item-delete" @click="handleDownload(file)">
                    <i class="el-icon-download"></i>
                  </span>
                  <span class="el-upload-list__item-delete" @click="handleRemove(file)" v-if="title === '新增消息'">
                    <i class="el-icon-delete"></i>
                  </span>
                </span>
              </div>
            </el-upload>


  watch: {
    detailsDialog: {
      handler(v) {
        this.dialogVisible = v
        if (v) {
          if (this.title !== '新增消息') {
            this.formData = JSON.parse(JSON.stringify(this.detailsDialogData))
            if (this.formData.imgUrl === '') {
              this.fileList = []
            } else {
              let data = this.formData.imgUrl.split(',')
              data.some((e) => {
                let fileName = e.split('/')
                let files = {
                  name: fileName[fileName.length - 1],
                  url: e
                }
                this.fileList.push(files)
              })
            }
            if (this.title === '已发消息详情') {
              this.getSendMessage()
            }
          }
        }
      }
    }
  },


    // 发送消息
    sendMessage() {
      this.$refs.formData.validate((valid) => {
        if (valid) {
          let formData = new FormData()
          formData.append('messageTitle', this.formData.messageTitle)
          let is50M = 0
          if (this.fileList.length !== 0) {
            for (var i = 0; i < this.fileList.length; i++) {
              is50M += this.fileList[i].size
              formData.append('files', this.fileList[i].raw)
            }
          }
          const is50MBoolen = is50M / 1024 / 1024 < 50
          // 限制文件上传大小
          if (!is50MBoolen) {
            this.$notify.error({
              title: '错误',
              message: '上传文件总和大小不能超过 50MB!',
              duration: 1000
            })
          } else {
            axios.post('/binhuapis/saveMessageInfo', formData).then((res) => {
              if (res.data.code === 200) {
                this.handleClose()
                this.$emit('success')
                this.$notify({
                  title: '成功',
                  message: '发送成功!',
                  type: 'success',
                  duration: 1000
                })
              } else {
                this.$notify({
                  title: '警告',
                  message: '错误,' + res.data.message,
                  type: 'warning',
                  duration: 1000
                })
              }
            })
          }
        } else {
          this.$notify({
            title: '警告',
            message: '检查表单输入内容的合法性!',
            type: 'warning',
            duration: 1000
          })
          return false
        }
      })
    },
        // 附件
    uploading(e) {
      console.log(e)
      // let obj = {
      //   fileName: e.file.name,
      //   fileUrl: '',
      //   step: 2,
      //   uploader: localStorage.getItem('user') || ''
      // }
      // let url = '/apis/lawBookMain/uploadFile'
      // let formData = new FormData()
      // formData.append('multipartFile', e.file)
      // formData.append('lawBookFile', new Blob([JSON.stringify(obj)], { type: 'application/json' }))
      // axios({
      //   method: 'POST',
      //   url: url,
      //   data: formData,
      //   headers: {
      //     'Content-Type': 'multipart/form-data; boundary='
      //   }
      // }).then((res) => {
      //   // console.log(res.data)
      //   if (res.data.code === 200) {
      //     let data = res.data.data
      //     let files = {
      //       name: data.fileName,
      //       url: data.fileUrl,
      //       id: data.id
      //     }
      //   }
      // })
      this.fileList = this.$refs.upload.uploadFiles
    },
    handleRemove(file) {
      this.$confirm('此操作将永久删除该条数据, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      })
        .then(() => {
          // let fileUrl = ''
          // if (this.fileList && this.fileList.length > 0) {
          //   this.fileList.forEach((item) => {
          //     if (item.name === file.name) {
          //       fileUrl = item.data
          //     } else {
          //       fileUrl = file.url
          //     }
          //   })
          // } else {
          //   fileUrl = file.url
          // }
          let arr = this.$refs.upload.uploadFiles
          let index = arr.indexOf(file)
          // this.formInfo.main.attachFiles.splice(index, 1)
          arr.splice(index, 1)
          this.fileList.splice(index, 1)
          this.$message.success('删除成功!')
        })
        .catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          })
        })
    },
    handlePictureCardPreview(file) {
      console.log(file)
      this.dialogImageUrl = file.url
      this.fileDialogVisible = true
    },
    beforeAvatarUpload(file) {
      console.log(file)
      // 1MB=1024*1024(1MB=1024KB 1KB=1024MB)
      const is20M = file.size / 1024 / 1024 < 20
      // 限制文件上传大小
      if (!is20M) {
        this.$notify.error({
          title: '错误',
          message: '上传文件大小不能超过 20MB!',
          duration: 1000
        })
        return false
      }
      return true
    },
    handleDownload(file) {
      console.log(file)
      let url2 = file.url.replace(/\\/g, '/')
      let xhr = new XMLHttpRequest()
      xhr.open('GET', url2, true)
      xhr.responseType = 'blob'
      xhr.onload = () => {
        if (xhr.status === 200) {
          this.saveAs(xhr.response, file.name)
        }
      }
      xhr.send()
    },
    saveAs(data, name) {
      let urlObject = window.URL || window.webkitURL || window
      // eslint-disable-next-line camelcase
      let export_blob = new Blob([data])
      // eslint-disable-next-line camelcase
      let save_link = document.createElementNS('http://www.w3.org/1999/xhtml', 'a')
      save_link.href = urlObject.createObjectURL(export_blob)
      save_link.download = name
      save_link.click()
    },

你可能感兴趣的:(数学建模,servlet)