js前端分片傳輸大文件+mongoose后端解析

最近一直在完善mongoose做webserver的項目,其中程序升級要通過前端傳輸升級包到服務器。
因為第一次寫前端代碼,分片傳輸的邏輯,網上一堆,大同小異,而且版本啊,API不一致的問題,導致頭疼的很。后面廢了九牛二虎之力,想出了用websocket傳輸二進制升級包,再另加一個消息發送文件名,也就是二進制文件和文本文件分兩次發送。

function sendFile(file) {const reader = new FileReader();reader.onload = function(event) {const arrayBuffer = event.target.result;const uint8Array = new Uint8Array(arrayBuffer);const chunkSize = 10240;for (let i = 0; i < uint8Array.length; i += chunkSize) {const chunk = uint8Array.slice(i, i + chunkSize);websocket.send(chunk);}};reader.readAsArrayBuffer(file);
}

今天騰出時間來了,看著這個明顯不合理的做法。在網上查了下,同時傳輸二進制和文本消息的可以用http協議中的multipart/form-data。

# 請求頭 - 這個是必須的,需要指定Content-Type為multipart/form-data,指定唯一邊界值
Content-Type: multipart/form-data; boundary=${Boundary}# 請求體
--${Boundary}
Content-Disposition: form-data; name="name of file"
Content-Type: application/octet-streambytes of file
--${Boundary}
Content-Disposition: form-data; name="name of pdf"; filename="pdf-file.pdf"
Content-Type: application/octet-streambytes of pdf file
--${Boundary}
Content-Disposition: form-data; name="key"
Content-Type: text/plain;charset=UTF-8text encoded in UTF-8
--${Boundary}--

結果發送小的文本文件貌似沒啥問題,發送100多M的大文件,就死活搞不成功了,關鍵的是不知道咋解析帶有boundary的body內容,有個mg_http_next_multipart貌似沾點邊,但是沒能解析成功。
只好繼續百度了,結果發現好像mg_http_upload也有點沾邊,但是這個函數的含義,具體用法,又沒有注釋,真是難啊。
突然想著可以去微軟的bing搜索一下,立馬就出來了mongoose的官網,里面就寫了如何傳輸需要分片大文件的過程,具體參考mongoose手冊。
哎,真是多少年了,還是犯以前在學校的錯誤。課本概念,例子不弄清楚,就到處去看輔導書。這會是有現成的官網例子不看,成天去看別人的二手資料,也不知道資料是基于哪個API版本。
既然如此,那就下載mongoose手冊吧,這下可好了,github又打不開了,真是想干點事,太難了。
那就去gitee吧,一搜,還真有其他好人,早就把mongoose搬過來了,下載簡直不要太舒服了。
一切就緒,現用例子試試分片的例子。

document.getElementById('fileMcu').addEventListener('change', function(event) {selectFile = event.target.files[0];var r = new FileReader();r.readAsArrayBuffer(selectFile);r.onload = function() {sendFileData(selectFile.name, new Uint8Array(r.result), 1024*1024);};});var sendFileData = function(name, data, chunkSize) {var sendChunk = function(offset) {var chunk = data.subarray(offset, offset + chunkSize) || '';var opts = {method: 'POST', body: chunk};var url = '/uploadMcu?offset=' + offset + '&file=' + encodeURIComponent(name);fetch(url, opts).then(function(res) {if (res.ok && chunk.length > 0) sendChunk(offset + chunk.length);return res.text();});};sendChunk(0);};

后端C++代碼接收文件時,只用一句話,
mg_http_upload(connection, httpReq, &mg_fs_posix, “.”, 999999999);
簡直不要太舒服了,都不用自己拼包,自己打開文件寫入。
這個時候看了下mg_http_upload的源碼,里面就有獲取 mg_http_get_var(&hm->query, “offset”, buf, sizeof(buf));
mg_http_get_var(&hm->query, “file”, file, sizeof(file));語句。
這個好熟悉啊,不就是上面的URL后面跟的參數嗎?難怪不用自己拼包,打開文件寫入呢,你按照正確的格式傳輸數據,mg_http_upload就能搞定所有的事。
這個周末值了,頭疼的事情搞定了。從這個事情明白了,看官網手冊的重要性,不得不說老外搞開源項目還是很正規的,值得我們學習。還有就是做一件事情難點很多,哪怕你搞定了最重要的80%,還有不起眼的20%照樣能摧毀你,怎么樣讓自己的知識系統化,全面化,這樣才能不斷往前推進。

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

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

相關文章

MiniMind:3塊錢成本 + 2小時!訓練自己的0.02B的大模型。minimind源碼解讀、MOE架構

大家好&#xff0c;我是此林。 目錄 1. 前言 2. minimind模型源碼解讀 1. MiniMind Config部分 1.1. 基礎參數 1.2. MOE配置 2. MiniMind Model 部分 2.1. MiniMindForCausalLM: 用于語言建模任務 2.2. 主干模型 MiniMindModel 2.3. MiniMindBlock: 模型的基本構建塊…

引言:Client Hello 為何是 HTTPS 安全的核心?

當用戶在瀏覽器中輸入 https:// 時&#xff0c;看似簡單的操作背后&#xff0c;隱藏著一場加密通信的“暗戰”。Client Hello 作為 TLS 握手的首個消息&#xff0c;不僅決定了后續通信的加密強度&#xff0c;還可能成為攻擊者的突破口。據統計&#xff0c;超過 35% 的網站因 TL…

Dockerfile 完全指南:從入門到最佳實踐

Dockerfile 完全指南&#xff1a;從入門到最佳實踐 1. Dockerfile 簡介與作用 Dockerfile 是一個文本文件&#xff0c;包含了一系列用于構建 Docker 鏡像的指令。它允許開發者通過簡單的指令定義鏡像的構建過程&#xff0c;實現自動化、可重復的鏡像構建。 主要作用&#xf…

Python httpx庫終極指南

一、發展歷程與技術定位 1.1 歷史演進 起源&#xff1a;httpx 由 Encode 團隊開發&#xff0c;于 2019 年首次發布&#xff0c;目標是提供一個現代化的 HTTP 客戶端&#xff0c;支持同步和異步操作&#xff0c;并兼容 HTTP/1.1 和 HTTP/2。背景&#xff1a; requests 庫雖然功…

app加固

1、什么是加固? 我們之前講的逆向,大多數都是用加密算法去加密一些明文字符串,然后把得到的結果用 Base64、Hex等進行編碼后提交。加固其實也一樣&#xff0c;只不過他通常加密的是 dex文件而已。但是 dex 文件加密以后&#xff0c;安卓系統是沒法直接運行的。所以加固的核心&…

Win全兼容!五五 Excel Word 轉 PDF 工具解決多場景轉換難題

各位辦公小能手們&#xff01;今天給你們介紹一款超牛的工具——五五Excel Word批量轉PDF工具V5.5版。這玩意兒專注搞批量格式轉換&#xff0c;能把Excel&#xff08;.xls/.xlsx&#xff09;和Word&#xff08;.doc/.docx&#xff09;文檔唰唰地變成PDF格式。 先說說它的核心功…

springCloud/Alibaba常用中間件之Nacos服務注冊與發現

文章目錄 SpringCloud Alibaba:依賴版本補充六、Nacos:服務注冊與發現1、下載安裝Nacos2、服務注冊1. 導入依賴(這里以服務提供者為例)2. 修改配置文件和主啟動類3. 創建業務類4. 測試 3.服務映射1. 導入依賴2. 修改配置文件和主啟動類3. 創建業務類和RestTemplate配置類用來提…

uniapp中score-view中的文字無法換行問題。

項目場景&#xff1a; 今天遇到一個很惡心的問題&#xff0c;uniapp中的文字突然無法換行了。得..就介樣 原因分析&#xff1a; 提示&#xff1a;經過一fan研究后發現 scroll-view為了能夠橫向滾動設置了white-space: nowrap; 強制不換行 解決起來最先想到的是&#xff0c;父…

【STM32 學習筆記】I2C通信協議

注&#xff1a;通信協議的設計背景 3:00~10:13 I2C 通訊協議(Inter&#xff0d;Integrated Circuit)是由Phiilps公司開發的&#xff0c;由于它引腳少&#xff0c;硬件實現簡單&#xff0c;可擴展性強&#xff0c; 不需要USART、CAN等通訊協議的外部收發設備&#xff0c;現在被廣…

【網絡原理】數據鏈路層

目錄 一. 以太網 二. 以太網數據幀 三. MAC地址 四. MTU 五. ARP協議 六. DNS 一. 以太網 以太網是一種基于有線或無線介質的計算機網絡技術&#xff0c;定義了物理層和數據鏈路層的協議&#xff0c;用于在局域網中傳輸數據幀。 二. 以太網數據幀 1&#xff09;目標地址 …

控制臺打印帶格式內容

1. 場景 很多軟件會在控制臺打印帶顏色和格式的文字&#xff0c;需要使用轉義符實現這個功能。 2. 詳細說明 2.1.轉義符說明 樣式開始&#xff1a;\033[參數1;參數2;參數3m 可以多個參數疊加&#xff0c;若同一類型的參數&#xff08;如字體顏色&#xff09;設置了多個&…

[6-2] 定時器定時中斷定時器外部時鐘 江協科技學習筆記(41個知識點)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 V 30 31 32 33 34 35 36 37 38 39 40 41

數據庫的脫敏策略

數據庫的脫敏策略&#xff1a;就是屏蔽敏感的數據 脫敏策略三要求&#xff1a; &#xff08;1&#xff09;表對象 &#xff08;2&#xff09;生效條件&#xff08;脫敏列、脫敏函數&#xff09; &#xff08;3&#xff09;二元組 常見的脫敏策略規則&#xff1a; 替換、重排、…

Python序列化的學習筆記

1. Npy&Numpy O4-mini-Cursor&#xff1a;如果.npy文件里包含了「Python對象」而非純數值數組時&#xff0c;就必須在加載時加上allow_pickleTrue。

[思維模式-27]:《本質思考力》-7- 逆向思考的原理與應用

目錄 一、什么是逆向思考 1.1、逆向思考的六大核心思維模式 1.2、逆向思考的四大實踐方法 1. 假設倒置法 2. 缺陷重構法 3. 用戶反推法 4. 規則解構法 1.3、逆向思考的經典案例庫 1. 商業創新&#xff1a;從“賣產品”到“賣服務” 2. 用戶體驗&#xff1a;從“功能滿…

在python中,為什么要引入事件循環這個概念?

在Python中&#xff0c;事件循環&#xff08;Event Loop&#xff09;是異步編程的核心機制&#xff0c;它的引入解決了傳統同步編程模型在高并發場景下的效率瓶頸問題。以下從技術演進、性能優化和編程范式三個角度&#xff0c;探討這一概念的必要性及其價值。 一、同步模型的局…

Taccel:一個高性能的GPU加速視觸覺機器人模擬平臺

觸覺感知對于實現人類水平的機器人操作能力至關重要。而視覺觸覺傳感器&#xff08;VBTS&#xff09;作為一種有前景的解決方案&#xff0c;通過相機捕捉彈性凝膠墊的形變模式來感知接觸的方式&#xff0c;為視觸覺機器人提供了高空間分辨率和成本效益。然而&#xff0c;這些傳…

oracle 會話管理

會話管理 1&#xff1a;查看當前所有用戶的會話(SESSION)&#xff1a; SELECT * FROM V S E S S I O N W H E R E U S E R N A M E I S N O T N U L L O R D E R B Y L O G O N T I M E , S I D ; 其中 O r a c l e 內部進程的 U S E R N A M E 為空 2 &#xff1a;查看當前…

Python開發后端InfluxDB數據庫測試接口

1、使用PyCharm創建一個Python項目wzClear 2、新建package包wzInfluxdb和wzConfig包&#xff0c;如上圖所示&#xff0c;新建一個DB.json配置文件并添加influxdb配置信息&#xff0c;DB.json為統一配置文件 {"influxdbV1": {"url": "http://192.168.0…

采用LLaMa-Factory對QWen大模型實現微調(效果很好)

前言 LLaMA-factory是一個非常有用的開源框架。關于利用llama-factory實現大模型的微調&#xff0c;研究了有一個多月了&#xff0c;終于相對成功的微調了一個QWen的大模型。其中的曲折愿和大家分享&#xff01; 一、源碼的下載 在github上的網址&#xff1a; GitHub - hiyou…