当前位置: 首页 > article >正文

vue element upload取消上传后终止请求

当文件过大上传时,需要很长时间,用户如果点击取消上传,但是接口还在pending,所以需要在点击取消上传的时候终止请求

其实问题是因为我们表单涉及到上传是:需要上传的时候先调上传的api,后端返回一个当前上传文件的Id,再在表单提交的时候携带这个fileId提交过去
好处就是:不需要在表单的上传的时候new formData,在append(我个人感觉好处是这个)

思路

我是一个表单有多个upload文件。所以formRef定义了两个fileId和fileList

import { reactive } from "vue";
const formModel = reactive({
  name: "",
  fileId: "",
  modelConfigFileId: "",
  fileList: [],
  fileConfigList: []
});

上传使用的方法是upload的http-request api,取消上传使用的是on-removeapi

template代码

<el-form
ref="ruleFormRef"
:model="formModel"
>
		<el-form-item label="Model name" prop="name">
            <el-input v-model="formModel.name" />
        </el-form-item>
        <el-form-item label="File " prop="fileList">
            <el-upload
              v-model:file-list="formModel.fileList"
              :http-request="
                options => customCommonUpload(options, { type: 'fileList' })
              "
              :on-exceed="handleExceed"
              :on-remove="file => removeCommonFile(file, { type: 'fileList' })"
              :limit="1"
            >
              <template v-slot:trigger>
                <el-button type="primary">select file</el-button>
              </template>
            </el-upload>
        </el-form-item>
         <el-form-item label="config File" prop="fileConfigList">
            <el-upload
              v-model:file-list="formModel.fileConfigList"
              :http-request="
                options => customCommonUpload(options, { type: 'fileConfigList' })
              "
              :on-exceed="handleExceed"
              :on-remove="file => removeCommonFile(file, { type: 'fileConfigList' })"
              :limit="1"
            >
              <template v-slot:trigger>
                <el-button type="primary">select file</el-button>
              </template>
            </el-upload>
        </el-form-item>
</el-form>

script代码

const uploadCancelTokenSource = ref<any>(null);
const uploadConfigCancelTokenSource = ref<any>(null);

//上传文件
const customCommonUpload = async (
  options: { file: File },
  params: { type: string }
) => {
  const { file } = options;
  const { type } = params;
  const formData = new FormData();
  formData.append("file", file); // 添加文件到表单数据中

  try {
    // 使用 axios 或其他 HTTP 库来发送请求
    uploadConfigCancelTokenSource.value = axios.CancelToken.source();
    uploadCancelTokenSource.value = axios.CancelToken.source();
    const response = await axios({
      method: "post",
      url: "your api", // 替换为你的上传地址
      data: formData,
      cancelToken:
        type == "fileList"
          ? uploadCancelTokenSource.value.token
          : uploadConfigCancelTokenSource.value.token
    });

    // 上传成功的处理逻辑
    if (type == "fileList") {
      formModel.fileId = response.data.result[0].fileId;
    } else if (type == "fileConfigList") {
      formModel.modelConfigFileId = response.data.result[0].fileId;
    }
    console.log(formModel, "formModel==========");

    return response;
  } catch (error) {
    // 上传失败的处理逻辑
    if (axios.isCancel(error)) {
      console.log("Request canceled", error.message);
    } else {
      console.error("Error uploading file:", error);
    }
    throw error;
  }
};
//取消上传
const removeCommonFile = (uploadFile: UploadFile, params: { type: string }) => {
  const { type } = params;
  if (type == "fileList") {
    // 如果有正在进行的上传请求,取消它
    if (uploadCancelTokenSource.value) {
      uploadCancelTokenSource.value.cancel("File upload canceled");
      uploadCancelTokenSource.value = null;
    }

    // 更新文件列表
    const index = formModel.fileList.indexOf(uploadFile);
    if (index !== -1) {
      formModel.fileId = "";
      formModel.fileList.splice(index, 1);
    }
  } else if (type == "fileConfigList") {
    // 如果有正在进行的上传请求,取消它
    if (uploadConfigCancelTokenSource.value) {
      uploadConfigCancelTokenSource.value.cancel("File upload canceled");
      uploadConfigCancelTokenSource.value = null;
    }

    // 更新文件列表
    const index = formModel.fileConfigList.indexOf(uploadFile);
    if (index !== -1) {
      formModel.modelConfigFileId = "";
      formModel.fileConfigList.splice(index, 1);
    }
  }
};
const handleExceed = (files, fileList) => {
  ElMessage.warning(`当前限制选择 1 个文件,请先删除已上传的文件`);
};


http://www.kler.cn/news/356488.html

相关文章:

  • 滑铁卢大学大模型公开课资料来了,大模型入门到精通,非常详细收藏我这一篇就够了
  • OpenCV之换脸技术:一场面部识别的奇妙之旅
  • PHP 函数 func_num_args() 的作用
  • spring boot 集成 dynamic-datasource-spring-boot-starter
  • 如何通过AI情侣头像项目日入1000+:详细教程揭秘
  • 推荐?还是踩雷?3款中英互译软件大盘点,你真的选对了吗?
  • 时装购物|基于springBoot的时装购物系统设计与实现(附项目源码+论文+数据库)
  • 【计网笔记】数据链路层
  • Java实现简单的5阶m序列密钥生成
  • 《Linux服务与安全管理》| 磁盘与文件系统管理
  • linux jdk环境变量变量新配置方式
  • 哔​哩​哔​哩​一​面
  • CVTE Android面试题及参考答案(100道题)
  • python-django-mysql原生sql增删改查搭建搭建web项目
  • 在 WPF 中使用 OpenTK:从入门到进阶
  • GS-SLAM论文阅读--GSORB-SLAM
  • Debug-029-el-table实现自动滚动分批请求数据
  • R语言从多波段tif数据中逐个提取单波段数据
  • 黑马程序员 javaWeb基础学习,精细点复习【持续更新】
  • WIFI实现透传+接线图