antdesign+vue+ts自定义上传文件customRequest,显示进度条onProgress,axios请求中断axios.CancelToken。

这篇具有很好参考价值的文章主要介绍了antdesign+vue+ts自定义上传文件customRequest,显示进度条onProgress,axios请求中断axios.CancelToken。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ant自定义上传文件customRequest

customRequest里面有一个data参数,data包含了对file文件上传状态的操作:例如:onSuccess、onProgress、onError等 和file文件。
改变文件上传状态:可以通过改变fileList里面file的status和respones。

踩坑:
1、在customRequest文件上传完成以后,会自动重新更新一下fileList文件。上传之前挂载在file文件上的参数会丢失。
解决:必要参数创建一个新的list存放参数。通过文件uid关联

2、 删除文件, @remove默认会删除文件
解决:需要自定义删除fileList的时候,需要在方法后面 return false

dom代码

  <a-upload-dragger
            v-model:file-list="fileList"
            :multiple="true"
            :max-count="10"
            :disabled="fileList?.length >= 10"
            :customRequest="customRequest"
            @remove="handleRemove"
            :progress="progress"
            accept=".onnx,.pth"
            width="248px"
          >
          </a-upload-dragger>
 const customRequest = async (data: { file: any; onProgress?: any; onSuccess?: any }) => {
    const { file, onProgress, onSuccess } = data
 }

ant自定义上传文件 显示进度条

axios请求配置onUploadProgress,通过loaded和total计算出进度,自定义上传的onProgress同步进度到ant组件

  const progress: UploadProps['progress'] = {
    strokeColor: {
      '0%': '#108ee9',
      '100%': '#87d068'
    },
    strokeWidth: 3,
    format: percent => `${parseFloat(percent!.toFixed(2))}%`,
    class: 'test'
  } // 上传进度条
   const customRequest = async (data: { file: any; onProgress?: any; onSuccess?: any }) => {
    const { file, onProgress, onSuccess } = data
         let config = {
          timeout: 120000, //设置超时时长
          onUploadProgress: (Progress: { loaded: number; total: number }) => {
            let percents = Math.round((Progress.loaded * 100) / Progress.total)
            // 更新进度条
            onProgress({ percent: percents }, file)
          }
        }
        let formData = new FormData()
        formData.append('file', file)
        http
          .upload(url, formData, config)
          .then(resTwo => {
          })
          .catch(() => {
          })
 }

取消上传文件 axios中断请求

axios定义一个CancelToken,生成一个token promise带到请求,当需要中断请求的时候调用这个promise

  const CancelToken = axios.CancelToken
  const source = CancelToken.source()
  let config = {
          timeout: 120000, //设置超时时长
          onUploadProgress: (Progress: { loaded: number; total: number }) => {
            let percents = Math.round((Progress.loaded * 100) / Progress.total)
            // 更新进度条
            onProgress({ percent: percents }, file)
          },
          cancelToken: source.token
        }
        let formData = new FormData()
        formData.append('file', file)
        http
          .upload(url, formData, config)
          .then(resTwo => {
            onSuccess(resTwo, file)
          })
          .catch(() => {
            currenFile.status = 'error'
            currenFile.response = '上传失败'
          })
// 中断请求:
source.cancel('中断上传描述 可自定义。')

axios上传文件请求封装

 import Axios, from 'axios'
 export const http ={
  upload: (url: string, formData?: object, config?: object) => {
    return Axios({
      url: url, // 接口地址
      method: 'put',
      data: formData,
      ...config
    })
  }
 }

完整自定义上传代码

因为我是多文件上传,会涉及多个文件同时上传、取消中断。所以我定义了一个fileTokenArr存放文件上传的token文章来源地址https://www.toymoban.com/news/detail-424627.html

  import { http } from '@/services/http'
  
  interface File extends UploadFile {
    id?: string // 预上传后的id
  }
  const fileList = ref<File[]>([]) // 上传文件
  // 上传进度条
  const progress: UploadProps['progress'] = {
    strokeColor: {
      '0%': '#108ee9',
      '100%': '#87d068'
    },
    strokeWidth: 3,
    format: percent => `${parseFloat(percent!.toFixed(2))}%`,
    class: 'test'
  } 
  let fileTokenArr: FileToken[] = [] // 根据上传文件创建token数组
  
  const customRequest = async (data: { file: any; onProgress?: any; onSuccess?: any }) => {
    const { file, onProgress, onSuccess } = data

    // 在fileList获取当前文件
    const fileNameList = fileList.value.map(it => it.name)
    const fileIndex = fileNameList.lastIndexOf(file.name)
    let currenFile = fileList.value[fileIndex]

    // 判断同名文件
    const newFileList = fileList.value.slice()
    newFileList.splice(fileIndex, 1)
    let index = newFileList.findIndex(item => item.name === file.name)
    if (index !== -1) {
      message.error('暂不支持上传同名文件')
      currenFile.status = 'error'
      currenFile.response = '暂不支持上传同名文件'
      return false
    }

    // 判断文件类型
    let type = data.file.name.substr(data.file.name.lastIndexOf('.') + 1)
    if (type !== 'onnx' && type !== 'pth') {
      message.error('请上传onnx、pth格式的文件')
      currenFile.status = 'error'
      currenFile.response = '请上传onnx、pth格式的文件'
      return false
    }

    // 请求获取文件预上传地址和文件id
    let res = await req..............

    if (res) {
      if (res.code === 'SYSTEM-100000') {
        // axios token 用于中断请求
        const CancelToken = axios.CancelToken
        const source = CancelToken.source()
        // 存入token数组,uid为文件唯一标识。存入id是为了在正在上传的时候,取消预上传使用
        fileTokenArr.push({
          uid: file.uid,
          id: res.data[0].id,
          success: false,
          token: source
        })
        let uidFileIndex = fileTokenArr.findIndex(item => item.uid === currenFile.uid)

        // 根据上传地址上传问及那
        let config = {
          timeout: 120000, //设置超时时长
          onUploadProgress: (Progress: { loaded: number; total: number }) => {
            let percents = Math.round((Progress.loaded * 100) / Progress.total)
            // 更新进度条
            onProgress({ percent: percents }, file)
          },
          cancelToken: source.token
        }
        let formData = new FormData()
        formData.append('file', file)
        http
          .upload(res.data[0].presignedUrl, formData, config)
          .then(resTwo => {
            onSuccess(resTwo, file)
            // 上传成功以后: fileList被重新赋值,不能用currenFile
            const fileNameList = fileList.value.map(it => it.name)
            const fileIndex = fileNameList.lastIndexOf(file.name)
            fileList.value[fileIndex].id = res.data[0].id
            // 修改token数组里的上传状态
            fileTokenArr[uidFileIndex].success = true
            console.log('success', currenFile, fileList.value, fileTokenArr)
          })
          .catch(() => {
            currenFile.status = 'error'
            currenFile.response = '上传失败'
          })
      } else {
        message.error(res.message)
        currenFile.status = 'error'
        currenFile.response = res.message
        return false
      }
    }
  }
  // 删除单个预上传文件
  const handleRemove: UploadProps['onRemove'] = async (file: File) => {

    /**
     * 查询删除文件是否在正在上传文件数组
     * Y:(上传成功:调用取消预上传接口),(正在上传:调用axios中断上传请求,并调用取消预上传接口)
     * N: 从fileList移除该文件
     */
    let uidFileTokenIndex = fileTokenArr.findIndex(item => item.uid === file.uid)
    // 通过前端校验-已调用预上传接口
    if (uidFileTokenIndex !== -1) {
      // 未上传完成,正在上传
      if (!fileTokenArr[uidFileTokenIndex].success && file.status === 'uploading') {
        // 中断上传请求
        fileTokenArr[uidFileTokenIndex].token.cancel('中断上传。')
        // 移除文件操作
        ············
      } else {
        // 已上传完成-调用取消预上传接口
         // 移除文件操作
        ············
      }
    } else {
      // 前端判断失败的文件  (没有走预上传)
      const index = fileList.value.indexOf(file)
      const newFileList = fileList.value.slice()
      newFileList.splice(index, 1)
      fileList.value = newFileList
      return
    }
    return false
  }

到了这里,关于antdesign+vue+ts自定义上传文件customRequest,显示进度条onProgress,axios请求中断axios.CancelToken。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Axios中的onUploadProgress实现显示文件上传进度

    onUploadProgress 是 Axios 这个 JavaScript 库中用于处理 HTTP 请求的一个配置选项之一。Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 Node.js 中进行 HTTP 请求。 onUploadProgress 允许指定一个回调函数,在上传进度发生变化时被调用。这个回调函数接收一个进度事件对象作为参数

    2024年02月10日
    浏览(31)
  • SpringBoot+vue文件上传&下载&预览&大文件分片上传&文件上传进度

    SpringBoot+vue 大文件分片下载 Blob File spark-md5根据文件内容生成hash 大文件分片上传(批量并发,手动上传)vue组件封装-form组件 vue上传大文件/视频前后端(java)代码 springboot+vue自定义上传图片及视频 SpringBoot + VUE实现前台上传文件获取实时进度( 使用commons-fileupload设置上传监听

    2024年02月05日
    浏览(65)
  • vue项目element-ui上传组件自定义方法无法获取进度

    原因:element-ui中的up-load组件使用时,若用自定义上传http-request,会重新申明XMLHttpRequest,on-progress里的申明则被覆盖,无法使用该钩子,无法添加进度条 方案一:假进度条;写个假进度条优化用户体验,使用el-upload组件里on-change方法的status状态,配合定时器 ,以vue3为例 ,

    2024年02月15日
    浏览(38)
  • Vue+Element Progress 进度条显示文字 %修改,使用format方法显示文字可自定义

    要实现这样子的 将进度条里显示的文字 后的 % 去掉 主要用到 format 方法

    2024年02月09日
    浏览(38)
  • vue+ts大文件切片上传

    别看文字了,看代码注释吧§(* ̄▽ ̄*)§ 1. src 下 的.vue 文件 src/APP.vue 2. src下文件夹,与上方👆代码在同一目录 src/utils/index.ts 3.效果图   非常简单(。・ω・。) 

    2024年01月23日
    浏览(31)
  • Vue+ElementUI+Axios实现携带参数的文件上传(数据校验+进度条)

    可以实现对上传文件的类型,大小进行数据校验,以及对上传文件所要携带的数据也进行的校验,也有文件上传进度的进度条。 一、Vue 结构部分 弹窗显示(文件上传框+文本框+单选按钮) 二、JS部分 1、数据和数据校验部分 2、方法部分 三、后端代码(Springboot) 1、接口层方

    2024年01月17日
    浏览(34)
  • 完整教程:Java+Vue+Websocket实现OSS文件上传进度条功能

    文件上传是Web应用开发中常见的需求之一,而实时显示文件上传的进度条可以提升用户体验。本教程将介绍如何使用Java后端和Vue前端实现文件上传进度条功能,借助阿里云的OSS服务进行文件上传。 后端:Java、Spring Boot 、WebSocket Server 前端:Vue、WebSocket Client 安装依赖 UploadF

    2024年02月05日
    浏览(73)
  • 前端vue elementUI upload上传组件封装&多文件上传&进度条,后端servlet request.getPart()接收文件信息

    选中多个文件上传 通过 axios请求 onUploadProgress 方法监听 on-progress on-success 用这两个钩子函数实现进度条 下面有对应的函数。 本文是每个文件一个请求上传 也可以用一个请求上传多个文件,需要将文件遍历添加到 form 表单中,后端用 request.getParts(); 获取集合,有需要的可以改

    2024年02月11日
    浏览(35)
  • vue3+ts - element-plus封装上传文件图片组件

      近期做到的项目中有涉及到上传图片上传文件的需求,因为是pc管理后台,用到了element-plus框架,所以我也一起使用element-plus中的上传图片上传图片功能,并对它进行封装成一个组件,方便在多个地方使用。 1、上传文件、视频 2、上传图片   在这里上传图片和文件是分

    2024年02月12日
    浏览(39)
  • 【前端学习记录】vue中使用el-upload组件时,上传文件进度条没有实时更新

    问题背景 今天在项目中遇到一个问题,使用el-upload组件时,上传文件进度条没有实时更新,需要手动点击一下才会更新。 原理及可尝试方案 el-upload 组件默认的进度条是通过 Ajax 请求上传文件,并且进度条通过监听 xhr.upload 的 progress 事件来实时更新。但是,有些浏览器在处

    2024年02月01日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包