Make SPIFFSEditor work with other file systems (ESP32)

This commit is contained in:
me-no-dev
2017-09-08 13:36:24 +03:00
parent 9e300bcf90
commit 75fb9573e8
3 changed files with 24 additions and 20 deletions

View File

@@ -31,7 +31,6 @@
#ifdef ESP32 #ifdef ESP32
#include <WiFi.h> #include <WiFi.h>
#include <AsyncTCP.h> #include <AsyncTCP.h>
#include "SPIFFS.h"
#elif defined(ESP8266) #elif defined(ESP8266)
#include <ESP8266WiFi.h> #include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h> #include <ESPAsyncTCP.h>

View File

@@ -288,18 +288,18 @@ static bool matchWild(const char *pattern, const char *testee) {
return (*pattern == 0); return (*pattern == 0);
} }
#define SPIFFS_MAXLENGTH_FILEPATH 64 #define SPIFFS_MAXLENGTH_FILEPATH 32
static bool isExcluded(const char *filename) { static bool isExcluded(fs::FS _fs, const char *filename) {
const char *excludeList = EXCLUDELIST; const char *excludeList = EXCLUDELIST;
static char linebuf[SPIFFS_MAXLENGTH_FILEPATH]; static char linebuf[SPIFFS_MAXLENGTH_FILEPATH];
fs::File excludeFile=SPIFFS.open(excludeList, "r"); fs::File excludeFile=_fs.open(excludeList, "r");
if(!excludeFile){ if(!excludeFile){
excludeFile=SPIFFS.open(excludeList, "w"); excludeFile=_fs.open(excludeList, "w");
excludeFile.println("/*.js.gz"); excludeFile.println("/*.js.gz");
excludeFile.println(excludeList); excludeFile.println(excludeList);
excludeFile.close(); excludeFile.close();
excludeFile=SPIFFS.open(excludeList, "r"); excludeFile=_fs.open(excludeList, "r");
} }
if (excludeFile.size() > 0){ if (excludeFile.size() > 0){
uint8_t idx; uint8_t idx;
@@ -334,8 +334,9 @@ static bool isExcluded(const char *filename) {
// WEB HANDLER IMPLEMENTATION // WEB HANDLER IMPLEMENTATION
SPIFFSEditor::SPIFFSEditor(const String& username, const String& password) SPIFFSEditor::SPIFFSEditor(const String& username, const String& password, const fs::FS& fs)
:_username(username) :_fs(fs)
,_username(username)
,_password(password) ,_password(password)
,_authenticated(false) ,_authenticated(false)
,_startTime(0) ,_startTime(0)
@@ -347,12 +348,12 @@ bool SPIFFSEditor::canHandle(AsyncWebServerRequest *request){
if(request->hasParam("list")) if(request->hasParam("list"))
return true; return true;
if(request->hasParam("edit")){ if(request->hasParam("edit")){
request->_tempFile = SPIFFS.open(request->arg("edit"), "r"); request->_tempFile = _fs.open(request->arg("edit"), "r");
if(!request->_tempFile) if(!request->_tempFile)
return false; return false;
} }
if(request->hasParam("download")){ if(request->hasParam("download")){
request->_tempFile = SPIFFS.open(request->arg("download"), "r"); request->_tempFile = _fs.open(request->arg("download"), "r");
if(!request->_tempFile) if(!request->_tempFile)
return false; return false;
} }
@@ -378,9 +379,9 @@ void SPIFFSEditor::handleRequest(AsyncWebServerRequest *request){
if(request->hasParam("list")){ if(request->hasParam("list")){
String path = request->getParam("list")->value(); String path = request->getParam("list")->value();
#ifdef ESP32 #ifdef ESP32
File dir = SPIFFS.open(path); File dir = _fs.open(path);
#else #else
Dir dir = SPIFFS.openDir(path); Dir dir = _fs.openDir(path);
#endif #endif
path = String(); path = String();
String output = "["; String output = "[";
@@ -391,7 +392,7 @@ void SPIFFSEditor::handleRequest(AsyncWebServerRequest *request){
while(dir.next()){ while(dir.next()){
fs::File entry = dir.openFile("r"); fs::File entry = dir.openFile("r");
#endif #endif
if (isExcluded(entry.name())) { continue; } if (isExcluded(_fs, entry.name())) { continue; }
if (output != "[") output += ','; if (output != "[") output += ',';
output += "{\"type\":\""; output += "{\"type\":\"";
output += "file"; output += "file";
@@ -420,22 +421,22 @@ void SPIFFSEditor::handleRequest(AsyncWebServerRequest *request){
} }
} else if(request->method() == HTTP_DELETE){ } else if(request->method() == HTTP_DELETE){
if(request->hasParam("path", true)){ if(request->hasParam("path", true)){
SPIFFS.remove(request->getParam("path", true)->value()); _fs.remove(request->getParam("path", true)->value());
request->send(200, "", "DELETE: "+request->getParam("path", true)->value()); request->send(200, "", "DELETE: "+request->getParam("path", true)->value());
} else } else
request->send(404); request->send(404);
} else if(request->method() == HTTP_POST){ } else if(request->method() == HTTP_POST){
if(request->hasParam("data", true, true) && SPIFFS.exists(request->getParam("data", true, true)->value())) if(request->hasParam("data", true, true) && _fs.exists(request->getParam("data", true, true)->value()))
request->send(200, "", "UPLOADED: "+request->getParam("data", true, true)->value()); request->send(200, "", "UPLOADED: "+request->getParam("data", true, true)->value());
else else
request->send(500); request->send(500);
} else if(request->method() == HTTP_PUT){ } else if(request->method() == HTTP_PUT){
if(request->hasParam("path", true)){ if(request->hasParam("path", true)){
String filename = request->getParam("path", true)->value(); String filename = request->getParam("path", true)->value();
if(SPIFFS.exists(filename)){ if(_fs.exists(filename)){
request->send(200); request->send(200);
} else { } else {
fs::File f = SPIFFS.open(filename, "w"); fs::File f = _fs.open(filename, "w");
if(f){ if(f){
f.write((uint8_t)0x00); f.write((uint8_t)0x00);
f.close(); f.close();
@@ -453,7 +454,7 @@ void SPIFFSEditor::handleUpload(AsyncWebServerRequest *request, const String& fi
if(!index){ if(!index){
if(!_username.length() || request->authenticate(_username.c_str(),_password.c_str())){ if(!_username.length() || request->authenticate(_username.c_str(),_password.c_str())){
_authenticated = true; _authenticated = true;
request->_tempFile = SPIFFS.open(filename, "w"); request->_tempFile = _fs.open(filename, "w");
_startTime = millis(); _startTime = millis();
} }
} }

View File

@@ -2,20 +2,24 @@
#define SPIFFSEditor_H_ #define SPIFFSEditor_H_
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#ifdef ESP32
#include "SPIFFS.h"
#endif
#define EXCLUDELIST "/.exclude.files" #define EXCLUDELIST "/.exclude.files"
class SPIFFSEditor: public AsyncWebHandler { class SPIFFSEditor: public AsyncWebHandler {
private: private:
fs::FS _fs;
String _username; String _username;
String _password; String _password;
bool _authenticated; bool _authenticated;
uint32_t _startTime; uint32_t _startTime;
public: public:
SPIFFSEditor(const String& username=String(), const String& password=String()); SPIFFSEditor(const String& username=String(), const String& password=String(), const fs::FS& fs=SPIFFS);
virtual bool canHandle(AsyncWebServerRequest *request) override final; virtual bool canHandle(AsyncWebServerRequest *request) override final;
virtual void handleRequest(AsyncWebServerRequest *request) override final; virtual void handleRequest(AsyncWebServerRequest *request) override final;
virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final; virtual void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) override final;
}; };
#endif #endif