上一篇我们对服务端和阿里云oss的配置及前端调用做了简单的介绍,但是一直报错。最终判断是文件格式问题,通常我们在reactnative中用formData上传,

formData.append('file', {uri: file, name: nameType(type), type: 'multipart/form-data'});

这里的file是文件的本地路径,如"file://android_asset/文件名",这里注意file://在安卓选择后并没有,需要我们来进行添加。但事实证明这里并不能直接通过路径上传,而是需要对文件进行处理,转为二进制数据,我们这里选择的是'rn-fetch-blob'库。选择这个库的原因有两个,一是blob比ArrayBuffer存储的二进制数据更大比较适合不定大小的文件对象,而是我们采用的网络请求库 axios或者fetch在请求大文件时不是特别稳定,因此RNFetchBlob.fetch将是更好的选择。

Blob 与 ArrayBuffer的区别

  • Blob和ArrayBuffer都能存储二进制数据。Blob相对而言储存的二进制数据大(如File文件对象)。
  • ArrayBuffer对象表示原始的二进制数据缓冲区,即在内存中分配指定大小的二进制缓冲区(容器),用于存储各种类型化数组的数据,是最基础的原始数据容器,无法直接读取或写入, 需要通过具体视图来读取或写入,即TypedArray对象或DataView对象对内存大小进行读取或写入;Blob对象表示一个不可变、原始数据的类文件对象。
  • ArrayBuffer 是存在内存中的,可以直接操作。而 Blob 可以位于磁盘、高速缓存内存和其他不可用的位置。

 通过比较我们确定了文件格式,那么接下来上代码。

export const uploadFileToOSS = async (files: Array<string>,type: string,
): Promise<any[]> => {const ossConfig = await globalStore.getOssConfig();let saveFiles: any[] = [];rootStore.globalIndicator.changeStatus(true)for (const fileOne of files) {try {const filePath = `${ossConfig.dir}${Date.now()}_${nameType(type)}`;let fileLength = 0;const fileConfigs = [{ name: 'policy', data: ossConfig.policy },{ name: 'x-oss-signature', data: ossConfig.signature },{ name: 'x-oss-signature-version', data: ossConfig.version },{ name: 'x-oss-credential', data: ossConfig.x_oss_credential },{ name: 'x-oss-date', data: ossConfig.x_oss_date },{ name: 'x-oss-security-token', data: ossConfig.security_token },{ name: 'key', data: filePath },{ name: 'success_action_status', data: '200' },{name: 'file',filename: nameType(type),data: RNFetchBlob.wrap(fileOne)}];const res = await RNFetchBlob.fetch('POST',ossConfig.host,{ 'Content-Type': 'multipart/form-data;' },fileConfigs).uploadProgress((written, total) => {fileLength = total;const progress = Math.round((written / total) * 100);console.log(`已上传: ${progress}%`);});if (res?.info().status === 200) {const fileName = fileOne.substring(fileOne.lastIndexOf('/') + 1) || nameType(type);const params = {fileDir: ossConfig.dir,fileLength,fileName,filePath,mimeType: mimeType(type)};const result = await globalStore.saveUploadFile(params);console.log("result.data>", result.data);if (result.success) {saveFiles.push(result.data);}}} catch (error) {console.error('上传失败:', error);xmToast.fail('上传失败,请重试');}}rootStore.globalIndicator.changeStatus(false)return saveFiles;
};

此处强调几点注意事项:

1、rootStore.globalIndicator.changeStatus(true) 这是我写的一个全局的加载loading,可直接忽略,用自己的即可。

2、阿里云oss上传成功后,没有回调。

我们需要拼接出文件地址,我代码中是这样的。

`${ossConfig.host}}${ossConfig.dir}${Date.now()}_${nameType(type)}`

最终是这样的  http://xmgj2025-test.oss-cn-hongkong.aliyuncs.com/424234324_img.png

3、阿里云oss上传后的文件地址不能直接打开查看,而是直接下载了 。

这就造成了很大的不便。因此我们通过保存文件到我们的后端,由后端下载后通过我们的服务地址来预览,这样便可完美解决不能直接预览的问题了。

4、代码中我适配了同时上传多个文件,用到了循环,切记!!这里需要循环上传文件到oss,并且在上传后要掉接口保存文件到后端服务器,for循环不会等待异步完成,与我们的需要不否,因此我采用了for of 进行顺序上传。当然你也可以用map。

好了,通过上面的代码,我们已经可以顺利的上传文件到阿里云oss服务器了!

欢迎各位猿友提问,如果觉得写的不错,请留下你的赞哦!

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/78714.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/78714.shtml
英文地址,请注明出处:http://en.pswp.cn/web/78714.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 中 @Bean 注解详解:从入门到实践

在 Spring Boot 开发中&#xff0c;Bean注解是一个非常重要且常用的注解&#xff0c;它能够帮助开发者轻松地将 Java 对象纳入 Spring 容器的管理之下&#xff0c;实现对象的依赖注入和生命周期管理。对于新手来说&#xff0c;理解并掌握Bean注解&#xff0c;是深入学习 Spring…

TCP 协议设计入门:自定义消息格式与粘包解决方案

目录 一、为什么需要自定义 TCP 协议&#xff1f; TCP粘包问题的本质 1.1 粘包与拆包的定义 1.2 粘包的根本原因 1.3 粘包的典型场景 二、自定义消息格式设计 2.1 协议结构设计 方案1&#xff1a;固定长度协议 方案2&#xff1a;分隔符标记法 方案3&#xff1a;长度前…

了解一下OceanBase中的表分区

OceanBase 是一个高性能的分布式关系型数据库&#xff0c;它支持 SQL 标准的大部分功能&#xff0c;包括分区表。分区表可以帮助管理大量数据&#xff0c;提高查询效率&#xff0c;通过将数据分散到不同的物理段中&#xff0c;可以减少查询时的数据扫描量。 在 OceanBase 中操…

多线程网络编程:粘包问题、多线程/多进程服务器实战与常见问题解析

多线程网络编程&#xff1a;粘包问题、多线程/多进程服务器实战与常见问题解析 一、TCP粘包问题&#xff1a;成因、影响与解决方案 1. 粘包问题本质 TCP是面向流的协议&#xff0c;数据传输时没有明确的消息边界&#xff0c;导致多个消息可能被合并&#xff08;粘包&#xf…

大模型主干

1.什么是语言模型骨架LLM-Backbone,在多模态模型中的作用&#xff1f; 语言模型骨架&#xff08;LLM Backbone&#xff09;是多模态模型中的核心组件之一。它利用预训练的语言模型&#xff08;如Flan-T5、ChatGLM、UL2等&#xff09;来处理各种模态的特征&#xff0c;进行语义…

[创业之路-350]:光刻机、激光器、自动驾驶、具身智能:跨学科技术体系全景解析(光-机-电-材-热-信-控-软-网-算-智)

光刻机、激光器、自动驾驶、具身智能四大领域的技术突破均依赖光、机、电、材、热、信、控、软、网、算、智十一大学科体系的深度耦合。以下从技术原理、跨学科融合、关键挑战三个维度展开系统性分析&#xff1a; 一、光刻机&#xff1a;精密制造的极限挑战 1. 核心技术与学科…

SVTAV1 编码函数 svt_aom_is_pic_skipped

一 函数解释 1.1 svt_aom_is_pic_skipped函数的作用是判断当前图片是否可以跳过编码处理。 具体分析如下 函数逻辑 参数说明&#xff1a;函数接收一个指向图片父控制集的指针PictureParentControlSet *pcs, 通过这个指针可以获取与图片相关的各种信息&#xff0c;用于判断是否跳…

【Redis新手入门指南】从小白入门到日常使用(全)

文章目录 前言redis是什么&#xff1f;定义原理与特点与MySQL对比 Redis安装方式一、Homebrew 快速安装 Redis&#xff08;推荐&#xff09;方式二、源码编译安装redisHomebrew vs 源码安装对比 redis配置说明修改redis配置的方法常见redis配置项说明 redis常用命令redis服务启…

Linux grep 命令详解及示例大全

文章目录 一、基本语法二、常用选项及示例1. 基本匹配&#xff1a;查找包含某字符串的行2. 忽略大小写匹配 -i3. 显示行号 -n4. 递归查找目录下的文件 -r 或 -R5. 仅显示匹配的字符串 -o6. 使用正则表达式 -E&#xff08;扩展&#xff09;或 egrep7. 显示匹配前后行 -A, -B, -C…

【排序算法】快速排序(全坤式超详解)———有这一篇就够啦

【排序算法】——快速排序 目录 一&#xff1a;快速排序——思想 二&#xff1a;快速排序——分析 三&#xff1a;快速排序——动态演示图 四&#xff1a;快速排序——单趟排序 4.1&#xff1a;霍尔法 4.2&#xff1a;挖坑法 4.3&#xff1a;前后指针法 五&#xff1a;…

【platform push 提示 Invalid source ref: HEAD】

platform push 提示 Invalid source ref: HEAD 场景&#xff1a;环境&#xff1a;排查过程&#xff1a;解决&#xff1a; 场景&#xff1a; 使用platform push 命令行输入git -v 可以输出git 版本号&#xff0c;但就是提示Invalid source ref: HEAD&#xff0c;platform creat…

x-cmd install | Tuistash - Logstash 实时监控,告别图形界面,高效便捷!

目录 核心优势&#xff0c;一览无遗安装适用场景&#xff0c;广泛覆盖功能亮点&#xff0c;不容错过 还在为 Logstash 的监控而头疼吗&#xff1f;还在频繁切换图形界面查看数据吗&#xff1f;现在&#xff0c;有了 Tuistash&#xff0c;一切都将变得简单高效&#xff01; Tui…

【JEECG】BasicTable单元格编辑,插槽添加下拉组件样式错位

1.功能说明 BasicTable表格利用插槽&#xff0c;添加组件实现单元格编辑功能&#xff0c;选择组件下拉框错位 2.效果展示 3.解决方案 插槽内组件增加&#xff1a;:getPopupContainer"getPopupContainer" <template #salesOrderProductStatus"{ column, re…

论文阅读笔记——ROBOGROUND: Robotic Manipulation with Grounded Vision-Language Priors

RoboGround 论文 一类中间表征是语言指令&#xff0c;但对于空间位置描述过于模糊&#xff08;“把杯子放桌上”但不知道放桌上哪里&#xff09;&#xff1b;另一类是目标图像或点流&#xff0c;但是开销大&#xff1b;由此 GeoDEX 提出一种兼具二者的掩码。 相比于 GR-1&#…

K8S的使用(部署pod\service)+安装kubesphere图形化界面使用和操作

master节点中通过命令部署一个tomcat 查看tomcat被部署到哪个节点上 在节点3中进行查看 在节点3中进行停止容器&#xff0c;K8S会重新拉起一个服务 如果直接停用节点3&#xff08;模拟服务器宕机&#xff09;&#xff0c;则K8S会重新在节点2中拉起一个服务 暴露tomcat访…

纷析云开源财务软件:重新定义企业财务自主权

痛点直击&#xff1a;传统财务管理的三大桎梏 “黑盒”困局 闭源商业软件代码不可见&#xff0c;企业无法自主调整功能&#xff0c;政策变化或业务升级依赖厂商排期&#xff0c;响应滞后。 数据托管于第三方平台&#xff0c;存在泄露风险&#xff0c;合规审计被动受限。 成本…

mybatis 的多表查询

文章目录 多表查询一对一一对多 多表查询 一对一 开启代码片段编写 专注于 SQL的 编写 JDBC 的写法&#xff0c;注重于 SQL mybatis 在 一对一查询时&#xff0c;核心在于 建立每个表对应的实体类主键根据 主键 id 进行查询&#xff0c;副标根据 设定外键进行查询 在 SQL编写…

Scrapy爬虫实战:如何用Rules实现高效数据采集

Scrapy是一个强大的Python爬虫框架&#xff0c;而其中的Rules类则为爬虫提供了更高级的控制方式。本文将详细介绍如何在Scrapy中使用Rules&#xff0c;以及各个参数的具体作用&#xff0c;并结合实际场景说明Rules的必要性。 为什么需要Rules&#xff1f; 在Web爬取过程中&…

ActiveMQ 性能优化与网络配置实战(一)

一、引言 在当今分布式系统和微服务架构盛行的时代&#xff0c;消息中间件作为实现系统间异步通信、解耦和削峰填谷的关键组件&#xff0c;其重要性不言而喻。ActiveMQ 作为一款广泛应用的开源消息中间件&#xff0c;凭借其对多种消息协议的支持、灵活的部署方式以及丰富的功能…

免费视频压缩软件

一、本地软件&#xff08;支持离线使用&#xff09; 1. HandBrake 平台&#xff1a;Windows / macOS / Linux 特点&#xff1a;开源免费&#xff0c;支持多种格式转换&#xff0c;提供丰富的预设选项&#xff08;如“Fast 1080p”快速压缩&#xff09;&#xff0c;可自定义分…