突破測試環境文件上傳帶寬瓶頸!React Native 阿里云 OSS 直傳文件格式問題攻克二

上一篇我們對服務端和阿里云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;可自定義分…