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.
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.
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.
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 |
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
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.
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" ?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.