1. 安装依赖

首先需要安装 axioselement-ui,这两个依赖项是上传附件所必需的。

npm install axios element-ui --save
  1. 创建上传组件

在 Vue 组件中创建一个上传组件,包括一个上传按钮和一个进度条。

<template>
  <div>
    <el-upload
      :action="uploadUrl"
      :auto-upload="false"
      :show-file-list="false"
      :on-change="handleUpload"
    >
      <el-button type="primary">上传附件</el-button>
    </el-upload>
    <el-progress
      v-if="uploadProgress"
      :percentage="uploadProgress"
      :status="uploadStatus"
    ></el-progress>
  </div>
</template>

<script>
import { ElUpload, ElButton, ElProgress } from 'element-ui'
import axios from 'axios'

export default {
  name: 'Upload',
  components: { ElUpload, ElButton, ElProgress },
  data() {
    return {
      uploadUrl: '/api/upload',
      uploadProgress: 0,
      uploadStatus: '',
      file: null
    }
  },
  methods: {
    handleUpload(file) {
      this.file = file.raw
    },
    uploadFile() {
      const formData = new FormData()
      formData.append('file', this.file)

      axios.post(this.uploadUrl, formData, {
        onUploadProgress: progressEvent => {
          this.uploadProgress = Math.round(
            (progressEvent.loaded / progressEvent.total) * 100
          )
        }
      })
        .then(response => {
          this.uploadStatus = 'success'
          this.uploadProgress = 0
          this.$emit('upload-success', response.data)
        })
        .catch(error => {
          this.uploadStatus = 'exception'
          this.uploadProgress = 0
          console.log(error)
        })
    }
  }
}
</script>
  1. 实现上传功能

handleUpload 方法中,获取到上传的文件后将其存储在 file 变量中。在 uploadFile 方法中,将文件使用 FormData 格式进行提交,并利用 onUploadProgress 事件监听上传进度。

上传成功后,将进度条置为 0,并将上传状态设置为 success,并通过 $emit 方法向父组件传递上传成功的数据。上传失败时,将进度条置为 0,并将上传状态设置为 exception

  1. 使用上传组件

在父组件中引用上传组件,并监听上传成功事件。

<template>
  <div>
    <upload @upload-success="handleUploadSuccess"></upload>
  </div>
</template>

<script>
import Upload from './Upload.vue'

export default {
  name: 'App',
  components: { Upload },
  methods: {
    handleUploadSuccess(data) {
      console.log(data)
    }
  }
}
</script>
vue写一个上传附件功能有上传进度

原文地址: https://www.cveoy.top/t/topic/bhvi 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录