完美解決react-native文件直傳阿里云oss問題一

前言

通常情況下,作為前后端分離的項目來說,文件上傳是最尋常的功能之一。雖然每個公司選擇的文件管理云庫各不相同,但實現思路基本一致。我所在公司使用阿里云oss文件管理,之前服務端做了透傳,但是由于每個測試環境的帶寬限制,導致在測試環境出現文件上傳受限的問題。因此,痛定思痛,決定拋開中間層,直傳阿里云OSS。

上干貨

根據終端不同,阿里云oss官方文檔提供了多種直傳方式。

1、web端直傳

2、移動應用端直傳

3、小程序直傳

4、鴻蒙直傳

由于react-native是跨平臺框架,又是通過js編寫的,因此可供選擇的有web端直傳移動應用端直傳。但是對于很多RN開發者并不具備很強的原生開發能力,而且還需要引入OSS Android SDK,OSS iOS SDK,如果同時開發鴻蒙的話還需要引入OSS?Harmony?SDK,這樣不但維護成本高,開發周期也會增加,況且不利于維護。因此web端直傳成為唯一可供選擇,并且是最具完美的直傳方式。

根據官網實踐例子,一步一步進行。

服務端配置

您可以使用PostObject接口,將文件直接從 Web 端上傳到 OSS,服務器生成的簽名為直傳操作提供安全保障,同時支持配置上傳策略(Policy)以限制上傳操作并滿足業務需求。

實現服務端簽名直傳,只需3步:

說明?由于使用了臨時訪問憑證,整個過程中不會泄露業務服務器的長期密鑰,保證了文件上傳的安全性。

  1. 配置OSS:在控制臺創建一個Bucket,用于存儲用戶上傳的文件。同時,為 Bucket 配置跨域資源共享(CORS) 規則,以允許來自 Web 端的跨域請求。

  2. 配置服務端:調用STS服務獲取一個臨時訪問憑證,然后使用臨時訪問憑證和服務端預設的上傳策略Policy(如Bucket名稱、目錄路徑、過期時間等)生成簽名授權用戶在一定時間內進行文件上傳。

    {"Version": "1","Statement": [{"Effect": "Allow","Action": "oss:PutObject","Resource": "acs:oss:*:*:<Bucket名稱>/*"}]
    }

    ?

  3. 配置Web端:構造HTML表單請求,通過表單提交使用簽名將文件上傳到OSS。

前端上傳接口所需的oss配置參數,后端需要提供業務接口來提供,接收到所有必需的配置信息后,就可以請求上傳了。此請求將直接與OSS服務進行通信,從而實現文件的上傳。以下字段需要后端通過接口提供,至于后端如何獲取,請參考服務端簽名及參數組裝

客戶端實現

?根據官網給的web端例子,在ReactNative下是否可以直接使用呢?答案是否定的!

web端例子

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>服務端生成簽名上傳文件到OSS</title>
</head>
<body>
<div class="container"><form><div class="mb-3"><label for="file" class="form-label">選擇文件:</label><input type="file" class="form-control" id="file" name="file" required /></div><button type="submit" class="btn btn-primary">上傳</button></form>
</div><script type="text/javascript">
document.addEventListener('DOMContentLoaded', function () {const form = document.querySelector("form");const fileInput = document.querySelector("#file");form.addEventListener("submit", (event) => {event.preventDefault();const file = fileInput.files[0];if (!file) {alert('請選擇一個文件再上傳。');return;}const filename = file.name;fetch("/get_post_signature_for_oss_upload", { method: "GET" }).then((response) => {if (!response.ok) {throw new Error("獲取簽名失敗");}return response.json();}).then((data) => {let formData = new FormData();formData.append("success_action_status", "200");formData.append("policy", data.policy);formData.append("x-oss-signature", data.signature);formData.append("x-oss-signature-version", "OSS4-HMAC-SHA256");formData.append("x-oss-credential", data.x_oss_credential);formData.append("x-oss-date", data.x_oss_date);formData.append("key", data.dir + file.name); // 文件名formData.append("x-oss-security-token", data.security_token);formData.append("file", file); // file 必須為最后一個表單域return fetch(data.host, { method: "POST",body: formData});}).then((response) => {if (response.ok) {console.log("上傳成功");alert("文件已上傳");} else {console.log("上傳失敗", response);alert("上傳失敗,請稍后再試");}}).catch((error) => {console.error("發生錯誤:", error);});});
});
</script>
</body>
</html>

react-native中實現

// 多媒體類型
export const nameType = (type: string) => {switch (type) {case 'image':return 'image.png';case 'video':return `video.mp4`;case 'voice':return 'voice.wav';default:return 'image.png';}
};export const uploadFileToOSS = async function (file: string,type: string,config?: AxiosRequestConfig) {const ossConfig = await getOssConfig(); // 后端接口提供oss配置const fileName =`${ossConfig.dir}${Date.now()}_${nameType(type)}`const formData = new FormData();formData.append('success_action_status', '200');formData.append('policy', ossConfig.policy);formData.append("x-oss-signature", ossConfig.signature);formData.append("x-oss-signature-version", ossConfig.version);formData.append("x-oss-credential", ossConfig.x_oss_credential);formData.append("x-oss-date", ossConfig.x_oss_date);formData.append('key', fileName );formData.append("x-oss-security-token", ossConfig.security_token);formData.append('file', {uri: file, name: nameType(type), type: 'multipart/form-data'});try {const response = await axios({method: 'POST',url: ossConfig.host,data: formData,headers: { 'Content-Type': 'multipart/form-data' }});if (response.status == 200) {console.log(ossConfig.host+fileName )} else {throw new Error(`上傳失敗: ${response.status}`);}} catch (error) {if (!error.response) {console.error('Network Error:', error); // 如 Network Error} else {console.error('Response Error:', error.response.status, error.response.statusText, error.response);}}
}

看著似乎沒什么問題,那么去運行,果不其然,報錯了,而且沒有太多有用的信息。起初以為是參數傳錯了,經過仔細檢查一點沒錯。

這就怪了,經過反復的刪減修改,懷疑是文件格式問題,當然事實也確實如此。

修改文件格式后,終于,終于看到了黎明的曙光,100M的視頻瞬間上傳成功后,那種喜悅涌上心頭,那種手足無措后的驚喜,頓時讓我忘卻了幾天來焦頭爛額的疲憊。

好了下班了,幾天沒睡個好覺了,先休息了,下一篇我將詳細闡述如何解決文件格式導致ReactNative中使用web端直傳OSS報錯的問題。

歡迎猿友們評論,提問。如果覺得寫的不錯點個贊再走哦!

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81145.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81145.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81145.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5.運輸層

5. 運輸層 1. 概述 第2~4章依次介紹了計算機網絡體系結構中的物理層、數據鏈路層和網絡層&#xff0c;它們共同解決了將主機通過異構網絡互聯起來所面臨的問題&#xff0c;實現了主機到主機的通信然而在計算機網絡中實際進行通信的真正實體&#xff0c;是位于通信兩端主機中的…

告別手動時代!物聯網軟件開發讓萬物自動互聯

清晨&#xff0c;智能窗簾隨著陽光自動拉開&#xff1b;運動時&#xff0c;手表精準記錄著健康數據&#xff1b;回到家&#xff0c;室溫早已調節至最舒適狀態...這些場景的實現&#xff0c;都離不開物聯網軟件開發的技術支撐。在智能家居軟件開發、智能穿戴軟件開發、醫療器械軟…

Fiori學習專題十二:Shell Control as Container

為了讓我們的app更加適應不同的設備&#xff0c;這節課我們引入shell控件作為根元素 1.修改App.view.xml&#xff0c;加入Shell控件 <mvc:ViewcontrollerName"ui5.walkthrough.controller.App"xmlns"sap.m"xmlns:mvc"sap.ui.core.mvc"displa…

AI 與高性能計算的深度融合:開啟科技新紀元

在當今科技迅猛發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;與高性能計算&#xff08;HPC&#xff09;正以前所未有的態勢深度融合&#xff0c;這種融合宛如一場強大的風暴&#xff0c;席卷并重塑著眾多領域的格局。從科學研究的突破到商業應用的革新&#xff0c…

「Unity3D」TextMeshPro使用TMP_InputField實現,輸入框高度自動擴展與收縮

先看實現效果&#xff1a; 要實現這個效果&#xff0c;有三個方面的問題需要解決&#xff1a; 第一&#xff0c;輸入框的高度擴展&#xff0c;內部子元素會隨著錨點&#xff0c;拉伸變形——要解決這個問題&#xff0c;需要將內部元素改變父類&#xff0c;然后增加父類高度&am…

多模態大語言模型arxiv論文略讀(四十七)

AdaShield: Safeguarding Multimodal Large Language Models from Structure-based Attack via Adaptive Shield Prompting ?? 論文標題&#xff1a;AdaShield: Safeguarding Multimodal Large Language Models from Structure-based Attack via Adaptive Shield Prompting …

美的人形機器人即將投入實際應用

國內家電巨頭美的集團近日公布了其自主研發的人形機器人的具體落地計劃。根據公司披露的信息&#xff0c;這款機器人將于5月在湖北荊州的洗衣機工廠率先投入使用&#xff0c;承擔設備運維、質量檢測和物料搬運等工作任務。預計今年下半年&#xff0c;該機器人還將進入美的線下門…

從零開始搭建你的個人博客:使用 GitHub Pages 免費部署靜態網站

&#x1f310; 從零開始搭建你的個人博客&#xff1a;使用 GitHub Pages 免費部署靜態網站 在互聯網時代&#xff0c;擁有一個屬于自己的網站不僅是一種展示方式&#xff0c;更是一種技術能力的體現。今天我們將一步步學習如何通過 GitHub Pages 搭建一個免費的個人博客或簡歷…

canvas動畫:點隨機運動 距離內自動連接成線 鼠標移動自動吸附附近的點

思路/實現步驟 創建canvas元素 獲取canvas的上下文ctx 初始化點的信息&#xff08;數量、初始坐標、移動方向、移動速度、大小、顏色&#xff09; 繪制點 繪制點之間的連線 點有規律的動起來 動畫循環 鼠標移動相關邏輯 點鼠標之間連線 鼠標吸附邏輯 添加配置項 重繪…

2025年4月AI科技領域周報(4.21-4.27):大模型生態加速演進 通用AI開啟產業融合新范式

2025年4月AI科技領域周報&#xff08;4.21-4.27&#xff09;&#xff1a;大模型生態加速演進 通用AI開啟產業融合新范式 一、本周熱點回顧1. OpenAI發布全球首款通用AI芯片「GPT-NPU」 重塑AI算力架構2. 谷歌DeepMind發布醫療AI系統「Med-Pathfinder」 實現全科室智能診斷3. 微…

【Bash】可以請您解釋性地說明一下“2>1”這個語法嗎?

Qwen3-235B 當然可以&#xff01;我們一步步拆解 2>&1 的含義&#xff0c;用生活化的例子來理解它&#xff1a; &#x1f9e0; 前提知識&#xff1a;三個“水流通道” 在 Linux/Unix 系統中&#xff0c;程序運行時有三種默認的“水流通道”&#xff1a; 標準輸入&…

MAC如何安裝多版本jdk(以8,11,17為例)

MAC如何安裝多版本jdk(以8,11,17為例&#xff09;_mac安裝jdk17-CSDN博客

Nginx核心

一、概述 Nginx一個具有高性能的【HTTP】和【反向代理】的【WEB服務器】&#xff0c;同時也是一個電子郵件代理服務器。正向代理服務的是客戶端&#xff08;比如VPN&#xff09;&#xff0c;反向代理服務的是服務端。Nginx是多進程的&#xff0c;有一個Master進程控制多個Worke…

綜合開發-手機APP遠程控制PLC1500柱燈的亮滅

要通過 ??Unity3D?? 開發的手機 App 控制 ??電氣柜上面的柱燈&#xff0c;需要WIFI模塊作為橋梁&#xff0c;按照以下步驟實現&#xff1a; ??1. 硬件準備&#xff08;硬件部分&#xff09;?? ??所需材料?? ??ESP32開發板??&#xff08;如ESP32-WROOM-32&a…

五款提效工具

1. 億可達 核心功能&#xff1a;通過“觸發器動作”模式&#xff0c;實現任務自動執行&#xff08;如郵件轉發、評論回復、數據同步&#xff09;。 適用場景&#xff1a;自動同步Notion項目到滴答清單生成待辦事項 優勢&#xff1a;節省重復操作時間&#xff0c;減少人為錯誤&a…

Docker化HBase排錯實錄:從Master hflush啟動失敗到Snappy算法未支持解決

前言 在容器化時代&#xff0c;使用 Docker 部署像 HBase 這樣復雜的分布式系統也比較方便。社區也提供了許多方便的 HBase Docker 鏡像&#xff0c;沒有找到官方的 apache的&#xff0c;但有包含許多大數據工具的 harisekhon/hbase 或用于學習目的的 bigdatauniversity/hbase…

windows遠程服務器數據庫的搭建和遠程訪問(Mysql忘記密碼通過Navicat連接記錄解密密碼)

服務器數據庫的搭建和遠程訪問 mysql數據庫安裝&#xff08;詳細&#xff09; window安裝mysql詳細流程 路程&#xff1a;重設MySQL5密碼&#xff0c;發現遠程服務器原本有一個MySQL5&#xff0c;嘗試在服務器本地建立連接被拒絕&#xff0c;因為不知道密碼。 &#xff08;1…

每日c/c++題 備戰藍橋杯(P1093 [NOIP 2007 普及組] 獎學金)

洛谷P1093 [NOIP 2007 普及組] 獎學金 詳解題解 題目背景與要求 題目鏈接&#xff1a;P1093 獎學金 核心任務&#xff1a;根據學生三科總分評選前5名獎學金獲得者&#xff0c;需按特定規則排序輸出。 排序規則&#xff08;按優先級從高到低&#xff09;&#xff1a; 總分降…

openEuler 22.03 安裝 Nginx,支持離線安裝

目錄 一、環境檢查1.1 必要環境檢查1.2 在線安裝&#xff08;有網絡&#xff09;1.3 離線安裝&#xff08;無網絡&#xff09; 二、下載Nginx2.1 在線下載2.2 離線下載 三、安裝Nginx四、開機自啟服務五、開放防火墻端口六、常用命令 一、環境檢查 1.1 必要環境檢查 # 查看 g…

基于深度學習的圖像壓縮技術(二)

接上篇&#xff1a;基于深度學習的圖像壓縮技術&#xff08;一&#xff09;-CSDN博客 3 基于生成對抗神經網絡的圖像壓縮技術 生成對抗網絡是一種先進的無監督學習算法&#xff0c;由Goodfellow等人在2014 年首次提出&#xff0c;其核心思想源于博弈論。 生成對抗網絡在圖像壓…