# a-upload自定义上传(最大规模简化操作)

<template>

  <div style="margin: 10px 0;">
    <ta-upload
        :action="上传地址"
        listType="picture-card"
        :customRequest="handleCustomRequest"
        :fileList="fileList"
        @preview="handlePreview"
        @change="handleImageFileChange">
      <div v-if="fileList.length < 1">
        <ta-icon type="plus" />
        <div class="ant-upload-text">Upload</div>
      </div>
    </ta-upload>
    <ta-modal :visible="previewVisible" :footer="null" @cancel="handlePreviewCancel">
      <img alt="example" style="width: 100%" :src="previewImage" />
    </ta-modal>
  </div>
</template>
<script>  

import axios from 'axios';
export default {

  data() {
    return {
      previewVisible: false,
      previewImage: '',
      fileList: []
    }
  },
  methods: {
    async handleCustomRequest(options) {
      const {file, onProgress, onSuccess, onError} = options;

      console.log('自定义上传', options)

      try {
        // 创建取消令牌
        const source = axios.CancelToken.source();

        // 上传配置
        const config = {
          cancelToken: source.token,
          onUploadProgress: e => {
            const percent = Math.round((e.loaded / e.total) * 100);
            onProgress({percent});
          }
        };

        // 创建 FormData
        const formData = new FormData();
        formData.append('file', file);

        // 实际发送请求
        const response = await axios.post(this.$fileManageTool.getFileUploadUrl(), formData, config);
        if (response.data.errors && response.data.errors.length > 0) {
          this.$message.error(response.data.errors[0].msg)
          onError(response.errors[0].msg);
        } else {
          // 成功处理
          onSuccess(response.data
              , file);
        }

        // 返回中止方法(可选)
        return {
          abort() {
            source.cancel('用户取消上传');
          }
        };

      } catch (error) {
        if (axios.isCancel(error)) {
          console.log('请求被取消:', error.message);
        } else {
          onError(error);
        }
      }
    },

    handlePreviewCancel() {
      this.previewVisible = false
    },

    handlePreview(file) {
      this.previewImage = file.url || file.thumbUrl
      this.previewVisible = true
    },

    handleImageFileChange({fileList}) {
      this.fileList = fileList
      if (fileList.length > 0) {
        this.form.setFieldsValue({'imageContent': fileList[0].response?.data.vo.url})
      } else {
        this.form.setFieldsValue({'imageContent': ''})
      }
    },
  }
}
</script>