Arduino ESP8266如何分块下载大文件并写入SPIFFS?
分块下载文件到SPIFFS的ESP8266实现
以下是实现你需求的完整代码示例,包含分块下载(可指定分块大小)并写入SPIFFS的核心逻辑,同时补充了关键的错误检查环节:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClientSecureBearSSL.h> #include <FS.h> int downloadFile(const char* url, const char* fileName, size_t chunkSize) { // 初始化SPIFFS文件系统 if (!SPIFFS.begin()) { return -1; // SPIFFS初始化失败 } std::unique_ptr<BearSSL::WiFiClientSecure> client(new BearSSL::WiFiClientSecure); client->setInsecure(); // 跳过SSL证书验证(仅测试场景使用,生产环境建议启用证书验证) HTTPClient https; if (!https.begin(*client, url)) { SPIFFS.end(); return -2; // 连接目标服务器失败 } // 发送GET请求并获取响应状态码 int httpCode = https.GET(); if (httpCode != HTTP_CODE_OK) { https.end(); SPIFFS.end(); return -3; // HTTP请求失败 } // 打开SPIFFS文件准备写入 File file = SPIFFS.open(fileName, "w"); if (!file) { https.end(); SPIFFS.end(); return -4; // 文件打开失败 } // 分块读取HTTP流并写入文件 uint8_t buffer[1024]; // 缓冲区大小可按需调整,需不小于设定的chunkSize size_t bytesRead; while ((bytesRead = https.getStreamPtr()->readBytes(buffer, chunkSize)) > 0) { file.write(buffer, bytesRead); // 可选:调用file.flush()确保数据立即写入闪存,避免意外断电丢失数据 } // 清理资源 file.close(); https.end(); SPIFFS.end(); return 0; // 下载与写入操作成功 }
关键逻辑说明
- SPIFFS初始化:先确保文件系统正常启动,否则直接返回错误码终止操作。
- HTTPClient流程:通过
https.GET()获取HTTP响应状态码,仅当状态码为200(HTTP_CODE_OK)时才继续后续的分块读取。 - 分块读取:使用
getStreamPtr()->readBytes()从HTTP流中读取指定chunkSize的字节,返回实际读取的字节数,循环读取直到返回0(表示数据流结束)。 - 文件写入:每次读取到分块数据后,调用
file.write()将数据写入SPIFFS文件,可选调用file.flush()强制将缓存数据写入闪存。 - 资源清理:操作完成后必须关闭文件、结束HTTPClient连接、关闭SPIFFS,避免资源泄漏。
注意事项
setInsecure()仅适合测试场景,生产环境建议配置正确的SSL证书验证,避免安全风险。- 缓冲区大小建议不小于设定的
chunkSize,示例中使用1024字节是为了兼容更大的分块需求,你可以根据实际调整为100字节。 - 如果下载大文件,建议添加进度提示或超时处理,避免长时间阻塞主线程影响设备其他功能。
内容的提问来源于stack exchange,提问作者First User
相关产品推荐
相关产品推荐

