FSBrowser mit Cache control (SPIFFS)

Mehr
06 Aug 2016 15:01 - 06 Aug 2016 15:25 #30 von espfly
espfly erstellte das Thema FSBrowser mit Cache control (SPIFFS)
Ich habe den FS Browser etwas erweitert und ein Cache Control umgesetzt.

Setup:
// Client Header aufzeichnen (Filterliste)
  //here the list of headers to be recorded
  const char * headerkeys[] = {"User-Agent", "Cookie", "Etag", "If-None-Match"} ;
  size_t headerkeyssize = sizeof(headerkeys) / sizeof(char*);
  //ask server to track these headers
  server.collectHeaders(headerkeys, headerkeyssize );

Überarbeitete handleFileRead:
bool handleFileRead(String path) {
  String Match = "";
  DebugMessage("handleFileRead: " + path);

  if (path.endsWith("/")) path += "index.htm";
  String contentType = getContentType(path);
  String pathWithGz = path + ".gz";

  // Anfrage Etag vom Client auslesen
  if (server.hasHeader("If-None-Match")) {
    Match = server.header("If-None-Match");
  }

  if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) {
    if (SPIFFS.exists(pathWithGz)) path += ".gz";
    File file = SPIFFS.open(path, "r");
    String Etag = String(file.size());

    if (Etag == Match)
    { // Datei Etag(Größe) gleich
      file.close();
      server.sendHeader("Cache-Control", " max-age=20");
      server.sendHeader("ETag", Etag);
      server.send(304, "text/plain", "");
      DebugMessage("no change: " + path);
      return true;
    } else
    { // Datei Streamen
      if (path.endsWith(".png") || path.endsWith(".js") || path.endsWith(".css")) {
        server.sendHeader("Cache-Control", " max-age=20");
        server.sendHeader("ETag", Etag);
      }

      DebugMessage(String(millis() / 1000) + " start stream");
      size_t sent = server.streamFile(file, contentType);
      DebugMessage(String(millis() / 1000) + " finished");
      file.close();
      DebugMessage(String(millis() / 1000) +" closed: " + path);
      return true;
    }
  }
  DebugMessage("finished: " + path);
  return false;
}

Erweiterung des FSBrowser für einen einfachen Dateiupload:
void simpleupload(void)
{
  String sResponse = "";

  sResponse += "<!DOCTYPE html><html lang=\"de\"><head><body>";
  sResponse += "<form method='post' action='edit' name='submit' enctype='multipart/form-data'>";
  sResponse += "<input type='file' name='fileField'><br /><br />";
  sResponse += "<input type='submit' name='submit' value='Submit'>";
  sResponse += "</form>";
  sResponse += "</body>\r\n";
  sResponse += "</html>\r\n";

  server.send(200, "text/html", sResponse);
}

Erweiterung zum Dateien auflisten, aufrufen und löschen:
void simplelist(void)
{
  String sResponse = "";
  sResponse += "<!DOCTYPE html><html lang=\"de\"><head><body>";
  sResponse += "<body>\r\n";

  char cBuf[100];
  Dir dir = SPIFFS.openDir("/");
  while (dir.next()) {
    String fileName = dir.fileName();
    size_t fileSize = dir.fileSize();
    sprintf(cBuf, "File: <a href=\"%s\">%s</a>, size: %s\n", fileName.c_str(), fileName.c_str(), formatBytes(fileSize).c_str());

    sResponse += cBuf;
    sResponse += "<button type=\"button\" onclick=\"delFile('";
    sResponse += fileName.c_str();
    sResponse += "')\">Delete ";
    sResponse += fileName.c_str();
    sResponse += "</button>";
    sResponse += "<br>\r\n";
  }

  sResponse += "<script>\r\n";
  sResponse += "function delFile(file) {\r\n";
  sResponse += "var xhttp = new XMLHttpRequest();\r\n";
  sResponse += "var data = new FormData();\r\n";
  sResponse += "data.append('file', file);\r\n";
  sResponse += "xhttp.open(\"DELETE\", \"edit\", true);\r\n";
  sResponse += "xhttp.send(data);\r\n";
  sResponse += "}\r\n";
  sResponse += "</script>\r\n";

  sResponse += "</body>\r\n";
  sResponse += "</html>\r\n";
  server.send(200, "text/html", sResponse);
}
Letzte Änderung: 06 Aug 2016 15:25 von espfly.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
10 Aug 2016 09:32 #32 von supporter
FSBrowser mit Cache control (SPIFFS)
Haben sich die Probleme der String-Klasse bezüglich der Speicherverwaltung eigentlich schon gelöst?

Ich musste in einigen Arduino-Projekten deshalb bereits auf sprintf etc. ausweichen müssen obwohl die String-Klasse komfortabler ist...

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
22 Sep 2016 09:36 #74 von espfly
FSBrowser mit Cache control (SPIFFS)
Ich hatte bis jetzt keine Probleme mit der String-Klasse, obwohl ich diese recht oft verwende.
Welche Probleme gibt es hier?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
22 Sep 2016 14:14 #75 von supporter
FSBrowser mit Cache control (SPIFFS)
Hallo espfly,

der RAM-Speicher wurde mit der Zeit weggelutscht. Jedes Mal wenn sich der String verlängert hat, wurde auf dem µC neuner Platz dafür reserviert und der alte Speicherplat nicht wieder freigegeben. Beim Arduino trat das Problem Aufgrund des wenigen Speicherplatzes recht schnell auf und der Controller hing.

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
22 Sep 2016 14:30 #76 von espfly
FSBrowser mit Cache control (SPIFFS)
Das Problem hatte ich nie, obwohl ich viel mit Strings mache.
Mit Arduino habe ich nie Strings verwendet, nur char Arrays.

Vielleicht wurde der ESP unsauber programmiert?

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Mehr
27 Sep 2016 12:19 #89 von supporter
FSBrowser mit Cache control (SPIFFS)
Hallo espfly,

das Thema ist evtl. für alle doch interessanter als es auf den ersten Blick scheint.
Die String-Klasse ist nicht ESP-spezifisch sondern Bestandteil der Arduino-IDE.
Selbst dort ist es auch nur ein durch C++ geerbtes Problem.

Allgemeine Beschreibung der String-Klasse

Arduino-Forum Problembeschreibung 1
Arduino-Forum Problembeschreibung 2
Arduino-Forum Problembeschreibung 3

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Powered by Kunena Forum