Forum: Mikrocontroller und Digitale Elektronik ESP32 Webserver Download Logfile von SD-Karte, Arduino


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Michael K. (aemkai)


Angehängte Dateien:

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.

von Steve van de Grens (roehrmond)


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.

von Εrnst B. (ernst)


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.

von Michael K. (aemkai)


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

von N. M. (mani)


Lesenswert?

1
<a href2="/BtnDwnld" download>
2
  <button>Download</button>
3
</a>

Ohne 2 im href2, aber MIT download Attribut schonmal probiert?

https://www.w3schools.com/howto/howto_html_download_link.asp

von Michael K. (aemkai)


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.

von N. M. (mani)


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"
?

von Michael K. (aemkai)


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.

von Steve van de Grens (roehrmond)


Lesenswert?

Michael K. schrieb:
> Scheinbar sendet der ESP nichts an den Server zurück?

So etwas untersucht man wie gesagt mit Wireshark.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.