My friend we need people like you around here. I say, with generosity in sharing knowledge.
Very grateful for your post. Because I've been trying to resolve this issue for a few days, I finally bring this code that does what I need: It both opens SPIFFS files and loads them into ESP32.
I understand 5% of programming. That's why it takes me a long time and suffers a lot to get to what I need, but 95% of the time I get it through insistence.
Thanks again for your rich response.
#include <WiFiClient.h>
#include <ESP32WebServer.h>
#include <WiFi.h>
#include <ESPmDNS.h>
#include <FS.h>
#include <SPIFFS.h>
String serverIndex = "<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
"<input type='file' name='update'>"
"<input type='submit' value='Upload'>"
"</form>"
"<div id='prg'>progress: 0%</div>"
"<script>"
"$('form').submit(function(e){"
"e.preventDefault();"
"var form = $('#upload_form')[0];"
"var data = new FormData(form);"
" $.ajax({"
"url: '/update',"
"type: 'POST',"
"data: data,"
"contentType: false,"
"processData:false,"
"xhr: function() {"
"var xhr = new window.XMLHttpRequest();"
"xhr.upload.addEventListener('progress', function(evt) {"
"if (evt.lengthComputable) {"
"var per = evt.loaded / evt.total;"
"$('#prg').html('progress: ' + Math.round(per*100) + '%');"
"}"
"}, false);"
"return xhr;"
"},"
"success:function(d, s) {"
"console.log('success!')"
"},"
"error: function (a, b, c) {"
"}"
"});"
"});"
"</script>";
const char* ssid = ".......................";
const char* password = ".........................";
ESP32WebServer server(80);
File root;
bool opened = false;
String printDirectory(File dir, int numTabs) {
String response = "";
dir.rewindDirectory();
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
// Serial.println("**nomorefiles**");
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t'); // we'll have a nice indentation
}
// Recurse for directories, otherwise print the file size
if (entry.isDirectory()) {
printDirectory(entry, numTabs+1);
} else {
response += String("<a href='") + String(entry.name()) + String("'>") + String(entry.name()) + String("</a>") + String("</br>");
}
entry.close();
}
return String("List files:</br>") + response + String("</br></br> Upload file:") + serverIndex;
}
void handleRoot() {
root = SPIFFS.open("/", "r");
String res = printDirectory(root, 0);
server.send(200, "text/html", res);
}
bool loadFromSPIFFS(String path){
path.toLowerCase();
String dataType = "text/plain";
if(path.endsWith("/")) path += "index.htm";
if(path.endsWith(".src")) path = path.substring(0, path.lastIndexOf("."));
else if(path.endsWith(".jpg")) dataType = "image/jpeg";
else if(path.endsWith(".txt")) dataType = "text/plain";
else if(path.endsWith(".zip")) dataType = "application/zip";
Serial.println(dataType);
File dataFile = SPIFFS.open(path.c_str());
if (!dataFile)
return false;
if (server.streamFile(dataFile, dataType) != dataFile.size()) {
Serial.println("Sent less data than expected!");
}
dataFile.close();
return true;
}
void handleNotFound(){
if(loadFromSPIFFS(server.uri())) return;
Serial.println("SPIFFS Not Detected");
}
void setup(void){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Initialization done.");
//handle uri
server.on("/", handleRoot);
server.onNotFound(handleNotFound);
/*handling uploading file */
server.on("/update", HTTP_POST, [](){
server.sendHeader("Connection", "close");
},[](){
HTTPUpload& upload = server.upload();
if(opened == false){
opened = true;
root = SPIFFS.open((String("/") + upload.filename).c_str(), FILE_WRITE);
if(!root){
Serial.println("- failed to open file for writing");
return;
}
}
if(upload.status == UPLOAD_FILE_WRITE){
if(root.write(upload.buf, upload.currentSize) != upload.currentSize){
Serial.println("- failed to write");
return;
}
} else if(upload.status == UPLOAD_FILE_END){
root.close();
Serial.println("UPLOAD_FILE_END");
opened = false;
}
});
server.begin();
Serial.println("HTTP Server started");
SPIFFS.begin();
}
void loop(void){
server.handleClient();