1

So, I have a page to select a txt file from the user's device and save it to SD card:

<!DOCTYPE html>
<html>
<head>
 <title>File Upload </title>
</head>
<body>
 <h1>File Upload </h1>
<form method='POST' action='/upload' enctype='multipart/form-data'>
<input type='file' name='upload'>
<input type='submit' value='Upload'>
</form>
</body>
</html>

and here is my esp8266 code for handling the form :


 controlserver.on("/UPL", HTTP_GET, [](AsyncWebServerRequest *request){
 request->send(200, "text/html", upl);
 });
 controlserver.on("/upload", HTTP_POST, [](AsyncWebServerRequest *request) {
 request->send(200); }, handleUpload);
 
 
void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final) {
 String logmessage = "Client:" + request->client()->remoteIP().toString() + " " + request->url();
 if (!index) {
 logmessage = "Upload Start: " + String(filename);
 request->_tempFile = SD.open("/" + filename, "w");
 }
 if (len) {
 request->_tempFile.write(data, len);
 logmessage = "Writing file: " + String(filename) + " index=" + String(index) + " len=" + String(len);
 }
 if (final) {
 logmessage = "Upload Complete: " + String(filename) + ",size: " + String(index + len);
 request->_tempFile.close();
 request->redirect("/");
 }
}

My project is not big and it doesn't require SD card, and esp8266 has 4mb memory, I have tried to replace SD with spiffs, but I wasn't successful. I don't know that if it's possible to directly write the txt file to spiffs, but it will be ok if I could save it to a string the write it to a file in spiffs.

asked Sep 2, 2023 at 19:20
1
  • 1
    reduce your code to writing "x" to spiffs and reading it back Commented Sep 3, 2023 at 0:11

1 Answer 1

1

Thanks to this post, I did solve the problem.

Here is the full code, My html code for the upload page, the form is in the tag:


<!DOCTYPE html>
<html>
<head>
 <title>File Upload Example</title>
</head>
<body>
 <h1>File Upload Example</h1>
<form method="POST" action="/upload" enctype="multipart/form-data" target="iframe"><input type="file" name="upload"><input type="submit" value="Upload">
</form>
<iframe style="visibility: hidden;" src="http://" )+local_IPstr+"/Usm" name="iframe"></iframe>
</body>
</html>

code for ESP:


void handleUpload(AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
if (!index) {
 request->_tempFile = SPIFFS.open("/" + filename, "w");
 Serial.println("1");
}
if (len) {
 request->_tempFile.write(data, len);
 Serial.println("2");
}
if (final) {
 Serial.println("3");
 request->_tempFile.close();
 request->redirect("/");
}
}
 controlserver.on("/upload", HTTP_POST, [](AsyncWebServerRequest *request) {
 request->send(200); }, handleUpload);
 
 controlserver.on("/UPL", HTTP_GET, [](AsyncWebServerRequest *request){
 request->send(200, "text/html", upl);
 });
 readFile(SPIFFS, "/11.txt"); // show the content of the uploaded file, obviously you should know the name of the uploaded file!

you can write a function like this to make sure the file was delivered:

 readFile(fs::FS &fs, const char * path){
 Serial.printf("Reading file: %s\r\n", path);
 File file = fs.open(path, "r");
 if(!file || file.isDirectory()){
 Serial.println("- empty file or failed to open file");
 return String();
 }
 Serial.println("- read from file:");
 String fileContent;
 while(file.available()){
 fileContent+=String((char)file.read());
 }
 file.close();
 Serial.println(fileContent);
}
answered Sep 3, 2023 at 13:32

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.