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.mzph.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…