Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >react-开发经验分享-Upload上传功能的具体项目实现

react-开发经验分享-Upload上传功能的具体项目实现

作者头像
Mr. 柳上原
发布于 2019-05-17 04:12:42
发布于 2019-05-17 04:12:42
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

Author:Mr.柳上原

  • 付出不亚于任何的努力
  • 愿我们所有的努力,都不会被生活辜负
  • 不忘初心,方得始终

ant框架里,Upload上传文件组件的具体使用方法 antd的Upload组件可谓很强大了, 自带各种上传api action接口地址,accept类型控制,directory文件夹上传,beforeUpload上传钩子...... 一般能满足普通小项目的上传需求 不过不同的公司总会有很多不同的需求, 所以Upload提供了一个customRequest方法来做特殊上传需求,覆盖自身原本的上传逻辑, 比如,断点续传,接口检测,自研发桌面上传工具接入等等 customRequest的具体使用方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 自定义上传方法
    photoRequest = async (file) => {
        const _this = this
        let uploadUrl = `${UploadUrl}/file/upload/${file.uid}`

        const photoRequest = new Promise((resolve, reject) => {
            let formData = new FormData()

            formData.append("fileGuid", file.uid)
            formData.append("name", file.name)
            formData.append("file", file)

            let xhr = new XMLHttpRequest()

            xhr.open('POST', uploadUrl, true)
            xhr.send(formData)

            xhr.onload = function (e) {
                if (this.status === 200) {
                    let res = JSON.parse(this.response)

                    console.log(res, 'res')

                    if (res.code === "0") {
                        let { fileList } = _this.state
                        let newFileList = fileList.concat()

                        let photoData = {
                            from: 'pc-upload',
                            WXPath: res.path,
                            localUrl: res.url,
                            deviceName: res.deviceName,
                            fileExt: res.ext,
                            uri: res.path,
                            url: `${UploadUrl}${res.url}`,
                            type: 'ORIGINAL',
                            name: file.name,
                            uid: file.uid
                        }

                        newFileList.push(photoData)

                        _this.setState({
                            fileList: newFileList
                        })

                        resolve({ code: '0', message: '上传成功' })
                    } else {
                        message.error({
                            message: '上传失败:',
                            duration: 3
                        })

                        resolve({ code: '1', message: '上传失败' })
                    }
                } else {
                    message.error({
                        message: '上传失败!',
                        duration: 3
                    })

                    resolve({ code: '1', message: '上传失败' })
                }
            }

            xhr.onerror = function (e) {
                message.error({
                    message: '上传失败!',
                    duration: 3
                })

                resolve({ code: '1', message: '上传失败' })
            }

            xhr.onabort = function () {
                message.error({
                    message: '上传异常终止!',
                    duration: 3
                })

                resolve({ code: '1', message: '上传异常终止' })
            }
        })

        return photoRequest
    }
}

需要注意的是,一般使用自定义上传方法后,删除图片的时候,都会出现一个报错

reqs[uid].abort is not a function

这是因为Promise是没有abort 方法的,只有原生js的XMLHttpRequest对象才具有abort

解决办法为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 简单粗暴的强行写入
const P = new Promise((resolve, reject) => {})
P.abort = () => {}

abort的具体使用方法,可以参考CSDN的Promise使用指南,或者菜鸟教程runoob,或者MDN的Java​Script专栏,或者,以下...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//通过cancelableXHR 方法取得包装了XHR的promise对象和取消该XHR请求的方法
//
function cancelableXHR(url){
    var req=new XMLHttpRequest();
    var promise=new Promise(function(resolve,reject){
        req.open('GET',url,true);
        req.onload=function(){
            if (req.status===200) {
                resolve(req.responseText);
            }else{
                reject(new Error(req.statusText))
            }
        }
        req.onerror=function(){
            reject(new Error(req.responseText))
        }
        req.onabort=function(){
            reject(new Error('abort this request'))
        }
        res.send();
    })
    var abort=function(){
        if (req.readyState!==XMLHttpRequest.UNSENT) {
            req.abort();
        }
    }

    return {
        promise:promise,
        abort:abort
    }
}

var object=cancelableXHR('http://www.sqqs.com/index')

timeoutPromise(object.promise,1000).then(function(content){
    console.log(`content:${content}`);
}).catch(function(error){
    if (error instanceof TimeoutError) {
        object.abort();
        return console.log(error)
    }
    console.log(`XHR Error:${error}`);
})
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ant design中upload组件 上传图片压缩
不想描述多余的,直接看代码简单直接 const [defaultFileList, setDefaultFileList] = useState([]); <Upload accept="image/*" customRequest={uploadImage} onChange={handleOnChange} listType="picture-card"
我乃小神神
2021/12/07
1.6K0
简化代码操作-文件上传组件封装
写在前面 最近一直在写关于angular的教程,但是因为一直没写到自己比较满意的一个状态,所以就先放到草稿箱里面吧,等我写的差不多以后再发出来,但是一直没有进行文章的更新也挺烦的,所以给大家封几个组件吧,简化大家的代码,今天从文件上传开始吧!后续我会更新别的一些组件封装的代码,你们希望哪些组件封装的可以留言,说清楚基于什么ui库即可! 特殊说明 为什么我说可以简化大家的操作呢,我们一般使用文件上传或者是封装文件上传的时候,只是将该文件封装为一个可以import导入使用的组件,但是我们在更新文件的时候
何处锦绣不灰堆
2022/01/13
1K0
vue-element-admin 上传upload图片慢问题处理
vue-element-admin自带上传图片组件,在使用的过程中发现上传速度很慢,尤其是上传一些大图需要耗时几十秒不能忍受。出现这种情况,是因为upload组件会将图片上传到action="https://httpbin.org/post" ,并返回转换成base64编码格式的数据。
孤烟
2020/09/27
2.2K4
如何实现类似于百度网盘大文件的断点续传
工作中如果有负责开放平台,那么往往会有上传文件的诉求。一般10M内大小的图片,我们能通过一个上传接口即可,但如果文件大小超过100M或者1G甚至更大,通过一个接口在人机交互上显然不友好,期望为用户提供进度条,实时告知上传进度;而且用户可以选择暂停,比如断网或上传了错误文件,用户也能随时恢复上传;若用户重复上传相同文件时,系统能提示秒传成功。也就是实现类似于百度网盘的上传功能。
Careteen
2022/02/14
2K0
如何实现类似于百度网盘大文件的断点续传
antd 实现批量上传
antd 中的 upload 组件功能强大,支持文件夹、拖拽、自动上传、ui 美观,文档完善,通过简单配置即可开发完功能,以功能为主的开发,建议使用组件完成
程序员王天
2023/10/18
1K0
前端vue 封装上传文件和下载文件的方法 导入方法直接使用
补充说明: 目前各大UI库都有upload上传文件的组件,内置方法就含有file对象,拿到后传入即可。
江一铭
2022/06/17
3.2K0
前端vue 封装上传文件和下载文件的方法 导入方法直接使用
el-upload上传文件
这个比较简单,因为element-plus也封装好了,只需要使用headers属性,去设置请求头即可
赤蓝紫
2023/03/16
2.1K0
el-upload上传文件
Node+Vue 实现大文件上传,断点续传等
【每日更新 Suggest 👍 question & answers】正经的前端学习 🌟🌟 一个 ☝️ 正经的前端学习,以阶段性来驱动学习,每天进步一点点🤏 !leetcode题解,记录自己的leetcode解题之路…… webvueblog.github.io/file-breakp… 地址 👇 github.com/webVueBlog/… Node+Vue 实现大文件上传,断点续传等 Vue 大文件上传和断点续传(帮忙点赞star谢谢,感谢♥) file-breakpoint-continue 源代码
达达前端
2022/04/29
2.9K0
Node+Vue 实现大文件上传,断点续传等
聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传
    其实现在市面上有很多前端的三方库都集成了分片上传的功能,比如百度的WebUploader,遗憾的是它已经淡出历史舞台,无人维护了。现在比较推荐主流的库是vue-simple-uploader,不过饿了么公司开源的elementUI市场占有率还是非常高的,但其实大家所不知道的是,这个非常著名的前端UI库也已经许久没人维护了,Vue3.0版本出来这么久了,也没有做适配,由此可见大公司的开源产品还是需要给业务让步。本次我们利用elementUI的自定义上传结合后端的网红框架FastAPI来实现分片上传。
用户9127725
2022/08/08
1.8K1
聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传
字节面试官:请你实现一个大文件上传和断点续传
原 作 者:yeyan1996原文链接:https://url.cn/5h66afn
Nealyang
2020/02/19
3K0
vue实现文件上传和下载_vue上传文件前端完整实例
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170636.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
4.3K0
vue实现文件上传和下载_vue上传文件前端完整实例
React项目中使用wangeditor以及扩展上传附件菜单
   在最近的工作中需要用到富文本编辑器,结合项目的UI样式以及业务需求,选择了wangEditor。另外在使用的过程中发现wangEditor只有上传图片和视频的功能,没有上传文本附件的功能,所以需要对其扩展一个上传附件的功能。
用户1174387
2022/05/11
3K0
React项目中使用wangeditor以及扩展上传附件菜单
el-upload 上传Demo
<el-upload class="upload-demo" ref="upload" :on-change="handleUploadChange" :on-success="handleImportSuccess" :before-upload="beforeImportUpload" :http-request="uploadZip" :file-list="fileList" :on-remove="handleUploadRemove
李维亮
2021/07/08
1.3K0
将文件拖到此处,点击上传
<template> <div v-loading="loading"> <el-upload ref="uploadExcel" class="upload-demo" drag :http-request="uploadFile" action="action" :limit="limitNum" :show-file-list="true" accept=".xlsx,.xls" :
达达前端
2020/11/12
1.3K0
【重要】你不得不知道的文件上传进度提示
当上传的文件相对较大时,用户可能需要等待较长的时间,这个时候前端如果没有任何提示的话,体验不是很好,如果有上传进度提示,就会好很多。而要在上传过程实时显示上传进度,则需要已上传的大小和文件总大小。
胡哥有话说
2019/07/25
1.1K0
大文件上传切片上传 vue java
使用vue+elementui进行前端开发, 实现在dialog中 带进度条的上传大文件页面
solate
2020/06/18
6.8K1
基于业务场景下的图片/文件上传方案总结
图片/文件上传组是企业项目开发中必不可少的环节之一, 但凡涉及到用户模块的都会有图片/文件上传需求, 在很多第三方组件库(ant desigin, element ui)中它也是基础组件之一. 接下来笔者就来带大家从零实现一款图片/文件上传组件以及扩展出更强大的上传组件.
徐小夕
2020/10/10
1.7K0
基于业务场景下的图片/文件上传方案总结
大文件分片上传 轻松拿捏
为了方便大家阅读和理解,我将以单个大文件上传为例,先简单描述下思路。 antd的上传组件有一个上传前的钩子,里面是可以拿到file信息,上传前将file切片,然后包装成一个一个的请求,放到一个数组,上传的的时候将数组的请求执行就可以了,执行完后发送一个合并请求,我没有用Promise.all去执行,而是2个2个的递归执行。
玖柒的小窝
2021/11/16
1.3K0
细说分片上传与极速秒传(SpringBoot+Vue实现)
1)调大服务端的文件上传限制:在一定长度上可以缓解上传限制问题,但并不是最优解。一方面无限制地调大上传大小会加大服务端的压力;一方面这个限制值调成多少是个需要考量的问题。
玛卡bug卡
2022/09/20
2.4K0
关于el-upload看这一篇就够了
通过 <input type="file"> on-change 事件获取上传文件
奋飛
2022/09/19
8.4K0
相关推荐
ant design中upload组件 上传图片压缩
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验