使用 Esp8266 Asyncwebser 流式传输文件

问题描述

我正在处理的项目中,我将使用 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);
}

我面临的问题是,如何使用 库流式传输该文件。当我访问 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);
}

我无法成功,谁能纠正我的错误! 其余的事情似乎都是正确的,只是我在流式传输该文件部分时被卡住了。

解决方法

假设您像这样声明 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);
   }
 }