-
Notifications
You must be signed in to change notification settings - Fork 24
/
FS.ino
159 lines (147 loc) · 5.18 KB
/
FS.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
// Инициализация FFS
void FS_init(void) {
SPIFFS.begin();
{
Dir dir = SPIFFS.openDir("/");
while (dir.next()) {
String fileName = dir.fileName();
size_t fileSize = dir.fileSize();
}
// Создаем список файлов каталога /lang
Lang = FileList("/lang");
}
//HTTP страницы для работы с FFS
//list directory
HTTP.on("/list", HTTP_GET, handleFileList);
//загрузка редактора editor
HTTP.on("/edit", HTTP_GET, []() {
if (!handleFileRead("/edit.htm")) HTTP.send(404, "text/plain", "FileNotFound");
});
//Создание файла
HTTP.on("/edit", HTTP_PUT, handleFileCreate);
//Удаление файла
HTTP.on("/edit", HTTP_DELETE, handleFileDelete);
//first callback is called after the request has ended with all parsed arguments
//second callback handles file uploads at that location
HTTP.on("/edit", HTTP_POST, []() {
HTTP.send(200, "text/plain", "");
}, handleFileUpload);
//called when the url is not defined here
//use it to load content from SPIFFS
HTTP.onNotFound([]() {
if (!handleFileRead(HTTP.uri()))
HTTP.send(404, "text/plain", "FileNotFound");
});
HTTP.on("/skins", HTTP_GET, []() {
String set=HTTP.arg("set");
//configJson = jsonWrite(configJson, "setIndex", set);
configSetup = jsonWrite(configSetup, "setIndex", set);
saveConfigSetup();
HTTP.send(307, "Temporary Redirect\r\nLocation: /\r\nConnection: Close\r\n", "");
});
}
// Здесь функции для работы с файловой системой
String getContentType(String filename) {
if (HTTP.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(".json")) return "application/json";
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 handleFileRead(String path) {
String setIndex = jsonRead(configSetup, "setIndex");
if (setIndex == "") setIndex = "index.htm";
if (path.endsWith("/")) path += setIndex;
String contentType = getContentType(path);
String pathWithGz = path + ".gz";
if (SPIFFS.exists(pathWithGz) || SPIFFS.exists(path)) {
if (SPIFFS.exists(pathWithGz))
path += ".gz";
File file = SPIFFS.open(path, "r");
size_t sent = HTTP.streamFile(file, contentType);
file.close();
return true;
}
return false;
}
void handleFileUpload() {
if (HTTP.uri() != "/edit") return;
HTTPUpload& upload = HTTP.upload();
if (upload.status == UPLOAD_FILE_START) {
String filename = upload.filename;
if (!filename.startsWith("/")) filename = "/" + filename;
fsUploadFile = SPIFFS.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();
}
}
void handleFileDelete() {
if (HTTP.args() == 0) return HTTP.send(500, "text/plain", "BAD ARGS");
String path = HTTP.arg(0);
if (path == "/")
return HTTP.send(500, "text/plain", "BAD PATH");
if (!SPIFFS.exists(path))
return HTTP.send(404, "text/plain", "FileNotFound");
SPIFFS.remove(path);
HTTP.send(200, "text/plain", "");
path = String();
}
void handleFileCreate() {
if (HTTP.args() == 0)
return HTTP.send(500, "text/plain", "BAD ARGS");
String path = HTTP.arg(0);
if (path == "/")
return HTTP.send(500, "text/plain", "BAD PATH");
if (SPIFFS.exists(path))
return HTTP.send(500, "text/plain", "FILE EXISTS");
File file = SPIFFS.open(path, "w");
if (file)
file.close();
else
return HTTP.send(500, "text/plain", "CREATE FAILED");
HTTP.send(200, "text/plain", "");
path = String();
}
void handleFileList() {
if (!HTTP.hasArg("dir")) {
HTTP.send(500, "text/plain", "BAD ARGS");
return;
}
String path = HTTP.arg("dir");
HTTP.send(200, "application/json", FileList(path));
}
// Создаем список файлов каталога
String FileList(String path) {
Dir dir = SPIFFS.openDir(path);
path = String();
String output = "[";
while (dir.next()) {
File entry = dir.openFile("r");
if (output != "[") output += ',';
bool isDir = false;
output += "{\"type\":\"";
output += (isDir) ? "dir" : "file";
output += "\",\"name\":\"";
output += String(entry.name()).substring(1);
output += "\"}";
entry.close();
}
output += "]";
return output;
}