ESP32 Webserver Download Logfile von SD-Karte, Arduino

OP #7663019
Lesenswert?

Hallo, ich möchte eigentlich nur eine Kleinigkeit basteln: ein Datenlogger, der selbst ein WLAN und eine Website bereitstellt. beim Klick auf einen Button soll das Logfile dann auf das Endgerät heruntergeladen werden.

An sich läuft alles, nur die Datei wird im Browser nicht heruntergeladen - ich kann den Fehler aber nicht finden. Zum Debuggen wird die Datei von der SD-Karte auf der Konsole ausgegeben, dass funzt, auch durch den Website-Button getriggert. Scheinbar wird der Request nicht an die Website zurückgegeben oder falsch oder .... Außerdem wird der Download scheinbar mehrmlas getriggert (je nach Browsert). An der Stelle bin ich aber mit meinem Latein am Ende.

Min-Bsp. im Anhang, benötigt noch zwei Bibliotheken ("AsyncTCP" und "ESPAsyncWebServer").

Vielleicht findet ja jemand meinen Fehler oder woran es hängt.

Angehängte Dateien:
Gast #7663097
Lesenswert?

Teste mal mit einer Datei < 5 kB Größe. geht es dann? Wenn ja, dann hast du einen Stack-Überlauf.

Ansonsten würde ich auf dem PC Wireshark benutzen, um die Netwerk-Kommunikation zum ESP Modul zu untersuchen.

#7663111
Lesenswert?

Der Fehler liegt im HTML, bzw. im JS:

1
  function BtnDownload()
2
  {
3
    var xhr = new XMLHttpRequest();
4
    xhr.open("GET", "/BtnDwnld", true);
5
    xhr.send();
6
  }

Holt zwar die Logdatei vom Server ab, verarbeitet die aber nicht weiter. Dafür müsstest du dem xhr noch entsprechende Callbacks verpassen.

Aber: Wenn du nur herunterladen willst, mach einfach einen stinknormalen "a" - Link auf "/BtnDwnld" statt dem <button> mit JS rein.

Wenn du das Logfile tatsächlich per Javascript im Browser verarbeiten willst, also nicht nur speichern, dann schau dir fetch() an, und verbrenne alle Bücher und Tutorials die noch auf "XMLHttpRequest" verweisen.

OP #7663460
Lesenswert?

Danke für die Hinweise, aber so recht komme ich nicht weiter.

Steve van de Grens schrieb:

Teste mal mit einer Datei < 5 kB Größe. geht es dann? Wenn ja, dann hast du einen Stack-Überlauf.

Nein, das ändert nichts.

Εrnst B. schrieb:

Der Fehler liegt im HTML, bzw. im JS:

Leider habe ich davon keinen Schimmer und kann mich nur an Tutorials lang hangeln.

Aber: Wenn du nur herunterladen willst, mach einfach einen stinknormalen "a" - Link auf "/BtnDwnld" statt dem <button> mit JS rein.

Da komme ich her. Im HTML habe ich

1
<a herf='/BtnDwnld'><button>Download</button></a>

dazu das <script>-Gedöns weg und im C-Code alle so gelassen (Schreib-"fehler" ist wegen Spam-Filter).

Im Browser öffnet sich dann die Seite 192.168.1.1/BtnDwnld mit dem Fehler:

1
Diese Seite funktioniert nicht
2
192.168.1.1 hat keine Daten gesendet.
3
ERR_EMPTY_RESPONSE
OP #7663488
Lesenswert?

Das "download" löst das Problem mit dem Link, es wird auch ein Download im Browser ausgelöst, aber er empfängt nichts. Scheinbar sendet der ESP nichts an den Server zurück? Der Browser triggert auch mehrmals den "/BtnDwnld"-Prozess (sichtbar an Debugausgabe), aber es kommt nichts an.

#7663511
Lesenswert?

Ein paar Ideen: Mach mal in den if(file) einen Print rein. Sicher dass er da reinkommt?

Und mach auch Mal "text/csv" anstatt "application/octet-stream".

Evtl müsste man der Response noch einen Header verpassen? So in der Art: "Content-Disposition", "attachment;filename=myfilename.csv" ?

OP #7663538
Lesenswert?

Herzlichen Dank an alle,

er ist nicht mehr in die Schleife gegangen. Wenn ich statt mit

1
file, file.name()

den Dateinamen direkt angebe und die Prüfung weglasse, dann funzt es. Die Variante mit dem Header ist auch notwendig, hatte ich zwischenzeitlich verworfen.

1
AsyncWebServerResponse *response = request->beginResponse(SD, "/Log2.csv", String(), true);
2
response->addHeader("Server", "ESP Async Web Server");
3
request->send(response);

Also nochmal 1000 Dank an alle Helfer! Ich hab jetzt mehrere Tage Tutorials gelesen und probiert, irgendwann sieht man den Wald nicht mehr.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren