// ADAPTED FROM: https://github.com/espressif/arduino-esp32/blob/master/libraries/WebServer/examples/FSBrowser/FSBrowser.ino #define FILESYSTEM SPIFFS #define FORMAT_FILESYSTEM true #define DBG_OUTPUT_PORT Serial //holds the current upload File fsUploadFile; //format bytes String formatBytes(size_t bytes) { if (bytes < 1024) { return String(bytes) + "B"; } else if (bytes < (1024 * 1024)) { return String(bytes / 1024.0) + "KB"; } else if (bytes < (1024 * 1024 * 1024)) { return String(bytes / 1024.0 / 1024.0) + "MB"; } else { return String(bytes / 1024.0 / 1024.0 / 1024.0) + "GB"; } } String getContentType(String filename) { if (webServer.hasArg("download")) { return "application/octet-stream"; } else if (filename.endsWith(".htm")) { return "text/html"; } else if (filename.endsWith(".html")) { return "text/html"; } else if (filename.endsWith(".css")) { return "text/css"; } else if (filename.endsWith(".js")) { return "application/javascript"; } else if (filename.endsWith(".png")) { return "image/png"; } else if (filename.endsWith(".gif")) { return "image/gif"; } else if (filename.endsWith(".jpg")) { return "image/jpeg"; } else if (filename.endsWith(".ico")) { return "image/x-icon"; } else if (filename.endsWith(".xml")) { return "text/xml"; } else if (filename.endsWith(".pdf")) { return "application/x-pdf"; } else if (filename.endsWith(".zip")) { return "application/x-zip"; } else if (filename.endsWith(".gz")) { return "application/x-gzip"; } return "text/plain"; } bool exists(String path){ bool yes = false; File file = FILESYSTEM.open(path, "r"); if(!file.isDirectory()){ yes = true; } file.close(); return yes; } bool handleFileRead(String path) { DBG_OUTPUT_PORT.println("handleFileRead: " + path); if (path.endsWith("/")) { path += "index.htm"; } String contentType = getContentType(path); String pathWithGz = path + ".gz"; if (exists(pathWithGz) || exists(path)) { if (exists(pathWithGz)) { path += ".gz"; } File file = FILESYSTEM.open(path, "r"); webServer.streamFile(file, contentType); file.close(); return true; } return false; } void handleFileUpload() { if (webServer.uri() != "/edit") { return; } HTTPUpload& upload = webServer.upload(); if (upload.status == UPLOAD_FILE_START) { String filename = upload.filename; if (!filename.startsWith("/")) { filename = "/" + filename; } DBG_OUTPUT_PORT.print("handleFileUpload Name: "); DBG_OUTPUT_PORT.println(filename); fsUploadFile = FILESYSTEM.open(filename, "w"); filename = String(); } else if (upload.status == UPLOAD_FILE_WRITE) { //DBG_OUTPUT_PORT.print("handleFileUpload Data: "); DBG_OUTPUT_PORT.println(upload.currentSize); if (fsUploadFile) { fsUploadFile.write(upload.buf, upload.currentSize); } } else if (upload.status == UPLOAD_FILE_END) { if (fsUploadFile) { fsUploadFile.close(); } DBG_OUTPUT_PORT.print("handleFileUpload Size: "); DBG_OUTPUT_PORT.println(upload.totalSize); } } void handleFileDelete() { if (webServer.args() == 0) { return webServer.send(500, "text/plain", "BAD ARGS"); } String path = webServer.arg(0); DBG_OUTPUT_PORT.println("handleFileDelete: " + path); if (path == "/") { return webServer.send(500, "text/plain", "BAD PATH"); } if (!exists(path)) { return webServer.send(404, "text/plain", "FileNotFound"); } FILESYSTEM.remove(path); webServer.send(200, "text/plain", ""); path = String(); } void handleFileCreate() { if (webServer.args() == 0) { return webServer.send(500, "text/plain", "BAD ARGS"); } String path = webServer.arg(0); DBG_OUTPUT_PORT.println("handleFileCreate: " + path); if (path == "/") { return webServer.send(500, "text/plain", "BAD PATH"); } if (exists(path)) { return webServer.send(500, "text/plain", "FILE EXISTS"); } File file = FILESYSTEM.open(path, "w"); if (file) { file.close(); } else { return webServer.send(500, "text/plain", "CREATE FAILED"); } webServer.send(200, "text/plain", ""); path = String(); } void handleFileList() { if (!webServer.hasArg("dir")) { webServer.send(500, "text/plain", "BAD ARGS"); return; } String path = webServer.arg("dir"); DBG_OUTPUT_PORT.println("handleFileList: " + path); File root = FILESYSTEM.open(path); path = String(); String output = "["; if(root.isDirectory()){ File file = root.openNextFile(); while(file){ if (output != "[") { output += ','; } output += "{\"type\":\""; output += (file.isDirectory()) ? "dir" : "file"; output += "\",\"name\":\""; output += String(file.name()).substring(1); output += "\"}"; file = root.openNextFile(); } } output += "]"; webServer.send(200, "text/json", output); }