0

我正在做一个项目,我将使用 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);
}

我面临的问题是,如何使用 <ESPAsyncWebServer.h> 库流式传输该文件。当我访问http://192.168.0.1/log.txt时,我需要查看 log.txt 文件中写入的内容。我试过了,

void httpLog(AsyncWebServerRequest *request)
{
  logfile.seek(0, SeekSet);
  request->send(SPIFFS, "/logs.txt","text/plain");
  logfile.seek(0, SeekEnd);
}

我无法获得成功,任何人都可以纠正我的错误!其余的一切似乎都是正确的,只是我被困在流式传输该文件部分。

4

1 回答 1

0

假设您像这样声明 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);
   }
 }
于 2021-07-26T07:12:48.367 回答