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

嘉兴市做网站优化/网络整合营销公司

嘉兴市做网站优化,网络整合营销公司,网站建设 从用户角度开始,中国建设银行美金账户登录网站react antd upload custom request处理多个文件上传的问题 背景:第一次请求需要请求后端返回aws 一个link,再往link push文件,再调用另一个接口告诉后端已经上传成功,拿到返回值。 再把返回值传给业务api... 多文件上传一直是循环…

react antd upload custom request处理多个文件上传的问题

背景:第一次请求需要请求后端返回aws 一个link,再往link push文件,再调用另一个接口告诉后端已经上传成功,拿到返回值。 再把返回值传给业务api... 多文件上传一直是循环触发custom request,并且文件上传完之后,需要利用websocket实时更改页面文件的状态

// Uploadinterface BotFile {botFileId: string;url: string;botFileKey: string;openaiFileId: string | null;type: number;fileUId: string;}const [defaultFileList, setDefaultFileList] = useState([]);// current uploaded file (antd Upload OnChange)const [currentUploadFileList, setCurrentUploadFileList] = useState<RcFile[]>([]);// aws completed upload filesconst [uploadedFileList, setUploadedFileList] = useState<BotFile[]>([]);const uploadFilesProps = (type: any) => {const allowedFileTypes = ['.txt','.docx','.pdf','.md','.csv','.json','.xlsx','.xls','.jpg','.jpeg','.png',];const maxTotalSize = 500 * 1024 * 1024;return {name: 'file',multiple: true,listType: 'picture',directory: type,showUploadList: false,action: '/api/sapien-storage/v1/file/frontEndUploads',data: { tenantId: currentUser?.tenantId, type: 'LOCAL_FILE' },headers: {Authorization: `Bearer ${getToken()}`,'api-pass-key': getRasKey(),},fileList: defaultFileList,accept: allowedFileTypes.join(','),beforeUpload(file: RcFile, fileList2: RcFile[]) {setShowCard(true);const ext = file.name.slice(((file.name.lastIndexOf('.') - 1) >>> 0) + 1).toLowerCase();if (!allowedFileTypes.includes(ext)) {message.error(file.name + ' Unsupported file format.');return Upload.LIST_IGNORE;}if (file.size === 0) {updateUploadStatus(file, 'error', 'File cannot be empty');return Upload.LIST_IGNORE;}if (ext === '.xlsx' && file.size > 3145728) {updateUploadStatus(file, 'error', 'Max 3MB');return Upload.LIST_IGNORE;} else if ((ext === '.jpg' || ext === '.jpeg' || ext === '.png') &&file.size > 10 * 1024 * 1024) {updateUploadStatus(file, 'error', 'Max 10MB');return Upload.LIST_IGNORE;} else if (file.size > 52428800) {updateUploadStatus(file, 'error', 'Max 50MB');return Upload.LIST_IGNORE;}let currentTotalSize = 0;let currentUploadFileSize = 0;fileList2.forEach((item) => {currentUploadFileSize += item.size || 0;});defaultFileList.forEach((item) => {currentTotalSize += item.size || 0;});if (currentTotalSize + currentUploadFileSize > maxTotalSize) {if (limitMsg) {updateUploadStatus(file, 'error', 'Max 500MB');setLimitMsg(false);setTimeout(() => {setLimitMsg(true);}, 1000);}return Upload.LIST_IGNORE;}},onProgress: (progressEvent: any, file: any) => {const percent = Math.floor((progressEvent.loaded / progressEvent.total) * 100);setUploadStatus((prevStatus) => {const newStatus: any = [...prevStatus];const fileIndex = newStatus.findIndex((item: any) => item.uid === file.uid);if (fileIndex !== -1) {newStatus[fileIndex].status = 'uploading';newStatus[fileIndex].percent = percent;} else {newStatus.push({uid: file.uid,name: file.name,status: 'uploading',percent: percent,size: file.size,});}return newStatus;});},onChange(info: any) {if (info.file.status === 'done') {if (info.file.response.code === '1001') {setPricingPlanContent(info.file.response.message);setPricingPlanModalVisible(true);setUploadStatus(info.fileList.filter((item: any) => item.uid !== info.file.uid));}setCurrentUploadFileList((prevList) => [...prevList, info.file]);}setDefaultFileList(info.fileList);if (fileListContainerRef.current) {fileListContainerRef.current.scrollTop = fileListContainerRef.current.scrollHeight;}},customRequest(options: any) {const { file, onSuccess, onError, onProgress } = options;const formData = {fileInfos: [{fileName: file.name,contentType: file.type,length: file.size.toString(),},],fileConstants: 'LOCAL_FILE',};const xhr = new XMLHttpRequest();setUploadRequests((prevRequests) => {const newRequests = new Map(prevRequests);newRequests.set(file.uid, xhr);return newRequests;});xhr.upload.onprogress = (event) => {const percent = Math.floor((event.loaded / event.total) * 100);onProgress({ percent }, file);};xhr.onload = () => {if (xhr.status < 200 || xhr.status >= 300) {onError(new Error('Upload error'));setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newStatus;});return;}const response = JSON.parse(xhr.responseText);const uploadResData = response.data[0];const awsUrl = uploadResData.link;const awsXhr = new XMLHttpRequest();setUploadRequests((prevRequests) => {const newRequests = new Map(prevRequests);newRequests.set(file.uid, awsXhr);return newRequests;});awsXhr.upload.onprogress = (event) => {const percent = Math.floor((event.loaded / event.total) * 100);onProgress({ percent }, file);};awsXhr.onload = () => {if (awsXhr.status < 200 || awsXhr.status >= 300) {onError(new Error('AWS Upload error'));setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newStatus;});return;}if (awsXhr.status === 200) {const awsCompletesFileUploadXhr = new XMLHttpRequest();setUploadRequests((prevRequests) => {const newRequests = new Map(prevRequests);newRequests.set(file.uid, awsCompletesFileUploadXhr);return newRequests;});const awsCompletesFileUploadFormData = {fileInfos: response.data,fileConstants: 'LOCAL_FILE',};awsCompletesFileUploadXhr.upload.onprogress = (event) => {const percent = Math.floor((event.loaded / event.total) * 100);onProgress({ percent }, file);};awsCompletesFileUploadXhr.open('POST','/api/sapien-storage/v1/file/awsCompletesFileUpload',true,);awsCompletesFileUploadXhr.onload = () => {if (xhr.status < 200 || xhr.status >= 300) {onError(new Error('Upload error'));setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newStatus;});return;}const awsXhrResponse: API.awsCompletedResponse = JSON.parse(awsCompletesFileUploadXhr.responseText,);if (awsXhrResponse && awsXhrResponse.success) {const awsResData = awsXhrResponse.data[0];const paramData = {botFileId: awsResData.id,url: awsResData.link,botFileKey: awsResData.name,openaiFileId: awsResData.openaiFileId,type: 1,fileUId: file.uid,};setUploadedFileList((prevList) => [...prevList, paramData]);setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'success', percent: 100 };}return item;});return newStatus;});}};awsCompletesFileUploadXhr.onerror = () => {onError(new Error('AWS Completion error'));setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newStatus;});};awsCompletesFileUploadXhr.setRequestHeader('Content-Type', 'application/json');awsCompletesFileUploadXhr.setRequestHeader('Authorization', `Bearer ${getToken()}`);const rasKey = getRasKey();if (typeof rasKey === 'string') {awsCompletesFileUploadXhr.setRequestHeader('api-pass-key', rasKey);}awsCompletesFileUploadXhr.send(JSON.stringify(awsCompletesFileUploadFormData));}onSuccess(response);};awsXhr.onerror = () => {onError(new Error('AWS Upload error'));setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newStatus;});};awsXhr.open('PUT', awsUrl, true);awsXhr.setRequestHeader('Content-Type', file.type);awsXhr.send(file);};xhr.onerror = () => {onError(new Error('Upload error'));setUploadStatus((prevStatus) => {const newStatus = prevStatus.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newStatus;});};xhr.open('POST', '/api/sapien-storage/v1/file/frontEndUploads', true);xhr.setRequestHeader('Content-Type', 'application/json');xhr.setRequestHeader('Authorization', `Bearer ${getToken()}`);const rasKey = getRasKey();if (typeof rasKey === 'string') {xhr.setRequestHeader('api-pass-key', rasKey);}xhr.send(JSON.stringify(formData));},};};useEffect(() => {if (currentUploadFileList.length === uploadedFileList.length) {updateFileList(uploadedFileList);}}, [uploadedFileList]);// upload closeconst interruptUpload = (file: any) => {const xhr = uploadRequests.get(file.uid);if (xhr) {xhr.abort();setUploadStatus((prevStatus) => {const newStatus: any = [...prevStatus];const fileIndex = newStatus.findIndex((item: any) => item.uid === file.uid);if (fileIndex !== -1) {newStatus[fileIndex].status = 'suspend';newStatus[fileIndex].percent = 0;}return newStatus;});setUploadRequests((prevRequests) => {const newRequests = new Map(prevRequests);newRequests.delete(file.uid);return newRequests;});setDefaultFileList((prevFileList: any) => {const newFileList = prevFileList.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});return newFileList;});const newFileList = defaultFileList.map((item: any) => {if (item.uid === file.uid) {return { ...item, status: 'error' };}return item;});updateFileList(newFileList);}};const deleteUpload = (file: any) => {const index = uploadStatus.findIndex((item) => item === file);if (index > -1) {const newUploadStatus = [...uploadStatus];newUploadStatus.splice(index, 1);setUploadStatus(newUploadStatus);}};// Upload End

onChange 里面setDefaultFileList就是把上传的文件列表放里面,方便之后对比文件上传的数量

setUploadRequests 方法是我用来close 上传用的,用不到请忽略

setUploadStatus 方法是我用来展示上传的状态用的,用不到可以忽略
下面这个代码就是我组装已经上传完的数据,之后用来作对比的

const paramData = {botFileId: awsResData.id,url: awsResData.link,botFileKey: awsResData.name,openaiFileId: awsResData.openaiFileId,type: 1,fileUId: file.uid,};setUploadedFileList((prevList) => [...prevList, paramData]);

比较长度,如果一致,那就走上传的逻辑

  useEffect(() => {if (currentUploadFileList.length === uploadedFileList.length) {updateFileList(uploadedFileList);}}, [uploadedFileList]);

七八个前端经手了,到我这里我也不知道该咋样了,反正最后是实现了

相关文章:

react antd upload custom request处理多个文件上传

react antd upload custom request处理多个文件上传的问题 背景&#xff1a;第一次请求需要请求后端返回aws 一个link&#xff0c;再往link push文件&#xff0c;再调用另一个接口告诉后端已经上传成功&#xff0c;拿到返回值。 再把返回值传给业务api... 多文件上传一直是循环…...

ALB快速实现IPv4服务的负载均衡

阿里云应用型负载均衡ALB支持HTTP、HTTPS和QUIC协议&#xff0c;专门面向网络应用层&#xff0c;提供强大的业务处理能力。 为了实现IPv4服务的负载均衡&#xff0c;需要快速创建一个ALB实例&#xff0c;并将来自客户端的访问请求转发至后端服务器。 操作流程 第一步&#x…...

【LLM】-12-部署Langchain-Chatchat-0.3.x版本

目录 1、0.3与0.2的功能对比 2、0.3.x支持多种部署方式 2.3、源码安装 2.3.1、项目源码下载 2.3.2、创建conda环境 2.3.3、安装poetry 2.3.4、安装依赖库 2.3.5、项目初始化 2.3.6、配置文件 2.3.7、初始化知识库 2.3.7、启动服务 2.3.8、配置说明 2.3.8.1、basic_…...

优化网络接收缓存减少数据丢包

视频领域&#xff0c;网络udp数据丢包会引起视频解码花屏。 1、修订单个socket的缓冲区大小&#xff1a;通过setsockopt使用SO_RCVBUF来设置接收缓冲区&#xff0c;该参数在设置的时候不会与rmem_max进行对比校验&#xff0c;但是如果设置的大小超过rmem_max的话&#xff0c;则…...

数据透视——判别分析

文章目录 判别分析简介常用的判别分析方法距离判别贝叶斯判别线性判别分析&#xff08;LDA&#xff09;支持向量机&#xff08;SVM&#xff09;总结 补充 在数据科学的丰富领域中&#xff0c;判别分析扮演着至关重要的角色。它是一种统计方法&#xff0c;用于预测样本数据的类别…...

书生大模型学习笔记 - 连接云端开发机

申请InternStudio开发机&#xff1a; 这里进去报名参加实战营即可获取 书生大模型实战营 InternStudio平台 创建开发机 SSH连接开发机&#xff1a; SSH免密码登录 本地创建SSH密钥 ssh-keygen -t rsa打开以下文件获取公钥 ~/.ssh/id_rsa.pub去InternStudio添加公钥 …...

Python操作符的重载

目录 1、操作符重载的基本概念1.1、常用的操作符重载方法1.1.1、算术操作符1.1.2、比较操作符1.1.3、比其他操作符 1.2、例子 2、应用场景2.1、增强代码的可读性2.2、 实现类的数学运算2.3、支持自定义的数据结构2.4、简化 API 设计2.5、实现链式操作和流式接口 3、总结 Python…...

redis面试(三)Hash数据结构

HASH 哈希&#xff0c;在redis底层实现的时候&#xff0c;数据的结构叫做dict 这个Dict就是一个用于维护key和value映射关系的数据结构&#xff0c;与很多语言中的Map类型相似。 本质上也是一个数组链表的形式存在&#xff0c;不同的点在于&#xff0c;每个dict中是可以存在…...

Java基础语法

注释 注释就是在程序指定位置添加的说明性信息 简单理解&#xff0c;就是对代码的一种解释 注释有三种&#xff1a; 单行注释 格式&#xff1a;//注释信息 多行注释 格式&#xff1a;/*注释信息*/ 文档注释 格式&#xff1a;/**注释信息*/ 注释的注意事项…...

Qt | QChart+QChartView+QLineSeries(折线图)+QBarSeries(柱状图)实战

点击上方"蓝字"关注我们 01、QLineSeries QLineSeries 是 Qt 中的一个类,用于在图表中表示一系列的数据点。它继承自 QAbstractSeries 类,提供了绘制折线图所需的基本功能。 常用的方法包括 append(x, y):向序列中添加一个新的数据点,其中 x 和 y 分别表示横坐…...

公布一批脸书爬虫(facebook)IP地址,真实采集数据

一、数据来源&#xff1a; 1、这批脸书爬虫&#xff08;facebook&#xff09;IP来源于尚贤达猎头公司网站采集数据&#xff1b; ​ 2、数据采集时间段&#xff1a;2023年10月-2024年7月&#xff1b; 3、判断标准&#xff1a;主要根据用户代理是否包含“facebook”和IP核实。…...

Package.Json 参数配置理解用途

"dev": "SET NODE_OPTIONS--openssl-legacy-provider & vue-cli-service serve --open" 这行命令首先设置环境变量NODE_OPTIONS&#xff0c;添加了--openssl-legacy-provider标志。这个标志用于解决某些情况下Node.js在Windows系统上使用OpenSSL时可能…...

k3:增加触发器,当外协单和报料单新增时,更新生产任务单的“说明”栏

外协单新增时 CREATE TRIGGER [dbo].[t_BOS257800018Entry2_update]ON [dbo].[t_BOS257800018Entry2]AFTER insert AS BEGINSET NOCOUNT ON; ------实现当外协时&#xff0c;生产任务单的说明有标识&#xff08;240731 BY WK&#xff09; declare fid_souce as int; declare…...

神奇海洋养鱼小程序游戏广告联盟流量主休闲小游戏源码

在海洋养鱼小程序中&#xff0c;饲料、任务系统、系统操作日志、签到、看广告、完成喂养、每日签到、系统公告、积分商城、界面设计、拼手气大转盘抽奖以及我的好友等功能共同构建了一个丰富而互动的游戏体验。以下是对这些功能的进一步扩展介绍&#xff1a; 饲料 任务奖励&a…...

分享几个适合普通人的AI副业变现思路

最近很多人问&#xff1a;看你做AI也做了有一两年了&#xff0c;也没见有什么产出啊&#xff1f;其实很多事情是长期主义&#xff0c;并不是一时半会儿马上就看到收益了。 正如董宇辉出名前也只是新东方默默无闻的一位老师&#xff0c;李佳琪曾经也只是一个化妆品销售。抱着长…...

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…...

二进制搭建 Kubernetes v1.20(中)

一、部署 CNI 网络组件 目录 一、部署 CNI 网络组件 1.flannel简介 1&#xff09;UDP模式 2&#xff09;VXLAN 模式 2.部署flannel ​编辑 3.Calico简介 1.flannel简介 K8S 中 Pod 网络通信&#xff1a;●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff0…...

Scrapy 爬取旅游景点相关数据(七):利用指纹实现“不重复爬取”

本期学习&#xff1a; 利用网页指纹去重 众所周知&#xff0c;代理是要花钱的&#xff0c;那么在爬取&#xff08;测试&#xff09;巨量网页的时候&#xff0c;就不可能对已经爬取过的网站去重复的爬&#xff0c;这样会消耗大量的时间&#xff0c;更重要的是会消耗大量的IP (金…...

java的对象向上转型

对象向上转型&#xff0c;父类对象就可以调用子类重写父类的方法&#xff0c;这样当父类对象需要添加新的功能时&#xff0c;只需要添加一个子类&#xff0c;在子类中对父类的功能进行扩展&#xff0c;而不需要更改父类代码 向上转型&#xff0c;格式如下 父类类型 父类对象子…...

Navicat Premium 16破解

Navicat Premium 16破解教程 1安装Navicat Premium 16 通过百度网盘分享的文件&#xff1a;Navicat_Premium_16_chs-x64.zip 链接&#xff1a;https://pan.baidu.com/s/1ryRSJ2d9s6rXI09LEmLtpw?pwdz7wo 提取码&#xff1a;z7wo 一直下一步即可 2破解 选择刚才安装路径&am…...

【C/C++】C语言到C++的入门知识点(主要适用于C语言精通到Qt的C++开发入门)

【C/C】C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发入门&#xff09; 文章目录 C语言与C的不同C中写C语言代码C语言到C的知识点Qt开发中需要了解的C基础知识namespace输入输出字符串类型class类构造函数和析构函数&#xff08;解析函数&#xff09;类的继…...

docker 建木 发版 (详细教程)

先创建git仓库 Git勤勉 两种方式上传-CSDN博客 把项目送上去 进入建木 可以接着这个来 dockerfile部署镜像 -&#xff1e;push仓库 -&#xff1e;虚拟机安装建木 -&#xff1e;自动部署化 (详细步骤)-CSDN博客 创建分组项目 开始操作 git 上钩子 前面链接里有这个教…...

什么样的人适合学习网络安全?

一、引言 在当今数字化的时代&#xff0c;网络安全已经成为了一个至关重要的领域。随着网络攻击的日益频繁和复杂&#xff0c;对于网络安全专业人才的需求也在不断增长。然而&#xff0c;并不是每个人都适合学习网络安全。那么&#xff0c;究竟什么样的人适合投身于这个充满挑…...

大厂linux面试题攻略四之Linux网络服务(二)

五、Linux网络服务-Apache优化 1.请写出工作中常见的Apache优化策略 Apache服务器优化是提升网站响应速度和稳定性的重要手段。在工作中&#xff0c;常见的Apache优化策略包括以下几个方面&#xff1a; 1. 启用压缩技术 Gzip压缩&#xff1a;使用Gzip压缩技术可以减少服务器…...

MySQL和PostgreSQL group by后 Concatenate 拼接所有的字符串

MySQL&#xff1a; GROUP_CONCAT(DISTINCT t2.T_CODES ORDER BY t2.T_CODES ASC) AS t_str, PostgreSQL 8.4 array_to_string(array_agg(t2.T_CODES), , ) AS t_str, PostgreSQL 9 string_agg(t2.T_CODES), , )...

Python爬虫技术 第24节 数据清洗和预处理(二)

在Python爬虫项目中&#xff0c;数据清洗和预处理是非常关键的步骤。这部分工作通常涉及到字符串操作、缺失值处理和数据格式转换等方面。下面我将详细讲解这些方面的内容&#xff0c;并提供具体的代码示例。 1. 字符串操作 字符串操作在数据清洗过程中非常重要&#xff0c;因…...

conda常用命令整理

Anaconda是一个流行的Python和R编程语言的开源发行版&#xff0c;用于科学计算和数据分析。它包含了许多常用的开源软件包和工具&#xff0c;适用于数据科学、机器学习、大数据处理和科学计算等领域。Anaconda的核心是conda。conda是一个包管理器和环境管理器&#xff0c;可以轻…...

JDK8新特性之Lambda表达式快速入门

目录标题 为什么使用 Lambda 表达式示例一&#xff1a;先看一个常用排序类Comparator的示例示例二&#xff1a;筛选员工数据的示例传统方式实现的示例策略模式优化的示例 Lambda 基础语法语法格式一&#xff1a;无参数&#xff0c;无返回值语法格式二&#xff1a;有一个参数&am…...

QEMU源码全解析 —— CPU虚拟化(14)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 《深度探索Linux系统虚拟化原理与实现》—— 王柏生 谢广军, 机械工业出版社 特此致谢! 三、KVM模块初始化介绍 2. KVM模块初始化 KV…...

libsoup的简单使用

基于GLib和libsoup的简单Web服务器示例&#xff0c;它可以处理静态HTML文件和动态JSON请求&#xff0c;并展示如何获取URL参数。 步骤&#xff1a; 初始化GLib和libsoup。创建一个处理静态HTML文件的处理器。创建一个处理动态JSON请求的处理器。获取URL参数并在JSON响应中返回…...