Wpis z mikrobloga

#arduino #esp32 #esp8266 #cplusplus Mam problem z zapisywaniem pliku na kartę SD z użyciem biblioteki ESPAsyncWebServer. Przez stronę www zapisuję sobie plik w taki sposób:

server.on("/upload", HTTP_POST, [](AsyncWebServerRequest * request) {
request->redirect("/");
}, handleUpload);

void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
File file;
if (!index) {
file = SD.open((String("/") + filename).c_str(), FILE_WRITE);
}

if (len) {
file.write(data, len);
}
if (final) {
file.close();
}
}

Na małych plikach powiedzmy do 1kb - wszystko działa. Ale jeśli już wysyłam plik np. 8kb czy nawet 2MB - ucina go. Co robię nie tak? Ma ktoś pomysł aby zapisywać większe pliki na karcie microSD?
  • 8
via Wykop Mobilny (Android)
  • 1
@loginek0: pewnie dlatego że plik dostajesz w kawałkach a ty całkowicie zlewasz wartość index, do tego file jest zmienną lokalną więc nie ma szansy się uchować przy kolejnych wywołaniach dla tego samego pliku i już przy drugi wywołaniu piszesz albo w kosmos albo do przypadkowych innych otwartych plików.
@zetisdead: Chyba faktycznie masz rację. Tylko dziwi mnie fakt, że przeszukałem chyba cały Internet i nigdzie nie ma prawidłowego przykładu :/
Sprawdziłem i w pętli tak to wygląda:

index: 0
len: 1304
____
index: 1304
len: 1436
___
index: 2740
len: 1436
___
index: 4176
len: 1436
___
index: 5612
len: 1436
___
index: 7048
len: 1436
____

Wystarczy, że zainicjuję zmienną file globalną i np. będę robił APPEND przy każdbym
Ja pit... wystarczyło dać File jako globalną


@loginek0: nie do końca. Przecież ten sam handler może być wywołany dla wielu różnych plików.
Powinieneś mieć mapę z nazwą pliku i strukturą file:

std::map files;

Dodatkowo każdy zapis do pliku warto poprzedzić ustawieniem wskaźnika zapisu w pliku, bo nie ma chyba żadnej gwarancji, że index nie może przeskoczyć do dowolnej pozycji.