完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在寻找创建一个 Web 表单,允许用户上传选定的文件,然后在用户的 Web 浏览器发送文件时将该文件流式传输到串行端口。这用于将固件上传到 Nextion LCD 面板。为了启动固件更新,我需要发送
,其中包括要发送的数据的预期文件大小。正在上传的文件可能大于本地存储,所以我无法在本地暂存整个文件 - 我必须通过串行发送文件,因为数据是通过 HTTP 发送给我的。这意味着我需要在传输开始之前知道要发送的文件的大小。 审查 和 在 ESP8266WebServer 的 GitHub 上,我发现 HTTPUploadstruct 包含“totalSize”和“currentSize”,它们分别跟踪到目前为止发送的字节总数和当前发送的片段的大小。因此,“totalSize”在文件完全传输之前不会提供完整的文件长度。 我测试过的浏览器(Chrome、FF 和 Win10 上的 Edge)在通过 HTTP POST 上传数据时都会发送“Content-Length”标头。可以返回该值,但它显然也包括发送的标头的长度。由于不同的浏览器发送不同的标头,当从不同的浏览器发送相同的文件时,这个值会有所不同。 所以这里的问题是:在传输开始之前,是否有任何通用的方法来获取通过 HTTP 上传的文件的文件大小?一种解决方案可能是以某种方式获取返回的标头的大小,以便我可以从 Content-Length 中减去该值以获得文件本身的大小,但我对任何事情都持开放态度。 下面是一个简化的草图,展示了一个基本的上传页面以及我如何收集标题和文件大小信息。生成的大小将通过串行和 HTTP 显示。如果您从不同的浏览器上传相同的文件,您会发现报告的长度不同。 代码:全选#include #include const char *ssid = "WiFiSSID"; const char *password = "WiFiPASSWORD"; ESP8266server server(80); void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("nConnected to " + String(ssid)); server.on("/", HTTP_GET, handleUploadPage); server.on("/", HTTP_POST, []() { server.send(200, "text/plain", ""); }, handleUploadTransfer); server.onNotFound(handleNotFound); const char *headerkeys[] = {"Content-Length"}; size_t headerkeyssize = sizeof(headerkeys) / sizeof(char *); server.collectHeaders(headerkeys, headerkeyssize); server.begin(); Serial.println("HTTP server started at http://" + WiFi.localIP().toString()); } void loop() { server.handleClient(); } void handleUploadTransfer() { HTTPUpload &upload = server.upload(); static long contentLength = 0; if (upload.status == UPLOAD_FILE_START) { Serial.println("UPLOAD_FILE_START"); Serial.println("upload.filename: " + String(upload.filename)); Serial.println("hostHeader: " + server.hostHeader()); Serial.println("header Content-Length: " + server.header("Content-Length")); contentLength = server.header("Content-Length").toInt(); Serial.println("contentLength: " + String(contentLength)); } else if (upload.status == UPLOAD_FILE_WRITE) { // Serial.println("UPLOAD_FILE_WRITE"); Serial.println("upload.currentSize: " + String(upload.currentSize)); } else if (upload.status == UPLOAD_FILE_END) { Serial.println("UPLOAD_FILE_END"); Serial.println("upload.totalSize: " + String(upload.totalSize)); Serial.println("contentLength - upload.totalSize = " + String(contentLength - upload.totalSize)); String httpMessage = " Upload test complete";"); server.send(200, "text/html", httpMessage); } } void handleUploadPage() { Serial.println("Sending upload page"); String httpMessage = ""); server.send(200, "text/html", httpMessage); } void handleNotFound() { Serial.println("Sending 404"); server.send(404, "text/plain", "404 not found"); } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
172个成员聚集在这个小组
加入小组436 浏览 1 评论
1315 浏览 1 评论
599浏览 6评论
498浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
481浏览 5评论
481浏览 4评论
466浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-15 00:47 , Processed in 0.651064 second(s), Total 44, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号