问题描述
我正在处理的项目中,我将使用 SPIFFS 编写从服务器获取的参数并显示网页。
void PostClient(AsyncWebServerRequest *request)
{
File file = SPIFFS.open("/logs.txt","w");
int paramsNr = request->params();
for(int i=0;i<paramsNr;i++){
AsyncWebParameter* p = request->getParam(i);
file.print(" Email: " + p->value());
file.print(" Password: " + p->value());
}
file.close();
request->send_P(200,"text/html",postPage);
}
我面临的问题是,如何使用
void httpLog(AsyncWebServerRequest *request)
{
logfile.seek(0,SeekSet);
request->send(SPIFFS,"/logs.txt","text/plain");
logfile.seek(0,SeekEnd);
}
我无法成功,谁能纠正我的错误! 其余的事情似乎都是正确的,只是我在流式传输该文件部分时被卡住了。
解决方法
假设您像这样声明 AsyncWebServer 实例:
AsyncWebServer server(80);
整个文件:
server.on("your_log_url",[](AsyncWebServerRequest *request) {
request->send(SPIFFS,"/logs.txt","text/plain");
}
其中的某些特定部分(例如,最后 200 个字符):
server.on("your_partial_log_url",[](AsyncWebServerRequest *request) {
File logFile = SPIFFS.open("/logs.txt","r"); // open my logFile.
if (!logFile) {
request->send(500); // HTTP Internal Server Error
}
else {
size_t len_to_serve = 200;
len_to_serve < logFile.size() ? logFile.seek(len_to_serve,fs::SeekMode::SeekEnd) : len_to_serve = logFile.size();
AsyncWebServerResponse *response = request->beginResponse(
"text/plain",len_to_serve,[logFile](uint8_t *buffer,size_t maxLen,size_t alreadySent) mutable -> size_t {
int bytes = logFile.read(buffer,maxLen); // link read buffer with response buffer
if (bytes + alreadySent == logFile.size()) logFile.close();
return max(0,bytes);
}
);
response->addHeader("extra_header_name","extra_header_value");
request->send(response);
}
}