Gz html files fix missing file server.html (#3582)

* Add files via upload

* Delete sd-card/html/file_server.html

* Update server_file.cpp

* Update server_file.cpp

---------

Co-authored-by: SybexX <Heinrich-Tuning@web.de>
This commit is contained in:
CaCO3
2025-02-24 21:55:16 +01:00
committed by GitHub
parent ec639d4236
commit 8f5bf209d9
4 changed files with 203 additions and 289 deletions

View File

@@ -6,11 +6,8 @@
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. CONDITIONS OF ANY KIND, either express or implied.
*/ */
#include "server_file.h" #include "server_file.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <string> #include <string>
@@ -58,7 +55,6 @@ struct file_server_data {
char scratch[SERVER_FILER_SCRATCH_BUFSIZE]; char scratch[SERVER_FILER_SCRATCH_BUFSIZE];
}; };
#include <iostream> #include <iostream>
#include <sys/types.h> #include <sys/types.h>
#include <dirent.h> #include <dirent.h>
@@ -67,11 +63,9 @@ using namespace std;
string SUFFIX_ZW = "_0xge"; string SUFFIX_ZW = "_0xge";
static esp_err_t send_logfile(httpd_req_t *req, bool send_full_file); static esp_err_t send_logfile(httpd_req_t *req, bool send_full_file);
static esp_err_t send_datafile(httpd_req_t *req, bool send_full_file); static esp_err_t send_datafile(httpd_req_t *req, bool send_full_file);
esp_err_t get_numbers_file_handler(httpd_req_t *req) esp_err_t get_numbers_file_handler(httpd_req_t *req)
{ {
std::string ret = flowctrl.getNumbersName(); std::string ret = flowctrl.getNumbersName();
@@ -87,7 +81,6 @@ esp_err_t get_numbers_file_handler(httpd_req_t *req)
return ESP_OK; return ESP_OK;
} }
esp_err_t get_data_file_handler(httpd_req_t *req) esp_err_t get_data_file_handler(httpd_req_t *req)
{ {
struct dirent *entry; struct dirent *entry;
@@ -131,7 +124,6 @@ esp_err_t get_data_file_handler(httpd_req_t *req)
return ESP_OK; return ESP_OK;
} }
esp_err_t get_tflite_file_handler(httpd_req_t *req) esp_err_t get_tflite_file_handler(httpd_req_t *req)
{ {
struct dirent *entry; struct dirent *entry;
@@ -175,12 +167,11 @@ esp_err_t get_tflite_file_handler(httpd_req_t *req)
return ESP_OK; return ESP_OK;
} }
/* Send HTTP response with a run-time generated html consisting of /* Send HTTP response with a run-time generated html consisting of
* a list of all files and folders under the requested path. * a list of all files and folders under the requested path.
* In case of SPIFFS this returns empty list when path is any * In case of SPIFFS this returns empty list when path is any
* string other than '/', since SPIFFS doesn't support directories */ * string other than '/', since SPIFFS doesn't support directories */
static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const char* uripath, bool readonly) static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const char *uripath, bool readonly)
{ {
char entrypath[FILE_PATH_MAX]; char entrypath[FILE_PATH_MAX];
char entrysize[16]; char entrysize[16];
@@ -192,82 +183,85 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const
char dirpath_corrected[FILE_PATH_MAX]; char dirpath_corrected[FILE_PATH_MAX];
strcpy(dirpath_corrected, dirpath); strcpy(dirpath_corrected, dirpath);
file_server_data * server_data = (file_server_data *) req->user_ctx; file_server_data *server_data = (file_server_data *)req->user_ctx;
if ((strlen(dirpath_corrected)-1) > strlen(server_data->base_path)) // if dirpath is not mountpoint, the last "\" needs to be removed
dirpath_corrected[strlen(dirpath_corrected)-1] = '\0';
DIR *dir = opendir(dirpath_corrected); if ((strlen(dirpath_corrected) - 1) > strlen(server_data->base_path)) {
// if dirpath is not mountpoint, the last "\" needs to be removed
dirpath_corrected[strlen(dirpath_corrected) - 1] = '\0';
}
DIR *pdir = opendir(dirpath_corrected);
const size_t dirpath_len = strlen(dirpath); const size_t dirpath_len = strlen(dirpath);
ESP_LOGD(TAG, "Dirpath: <%s>, Pathlength: %d", dirpath, dirpath_len); ESP_LOGD(TAG, "Dirpath: <%s>, Pathlength: %d", dirpath, dirpath_len);
/* Retrieve the base path of file storage to construct the full path */ // Retrieve the base path of file storage to construct the full path
strlcpy(entrypath, dirpath, sizeof(entrypath)); strlcpy(entrypath, dirpath, sizeof(entrypath));
ESP_LOGD(TAG, "entrypath: <%s>", entrypath); ESP_LOGD(TAG, "entrypath: <%s>", entrypath);
if (!dir) { if (!pdir) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat dir: " + std::string(dirpath) + "!"); LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat dir: " + std::string(dirpath) + "!");
/* Respond with 404 Not Found */ // Respond with 404 Not Found
httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404()); httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, get404());
return ESP_FAIL; return ESP_FAIL;
} }
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
/* Send HTML file header */ // Send HTML file header
httpd_resp_sendstr_chunk(req, "<!DOCTYPE html><html><body>"); httpd_resp_sendstr_chunk(req, "<!DOCTYPE html><html lang=\"en\" xml:lang=\"en\"><head>");
httpd_resp_sendstr_chunk(req, "<link href=\"/file_server.css\" rel=\"stylesheet\">");
httpd_resp_sendstr_chunk(req, "<link href=\"/firework.css\" rel=\"stylesheet\">");
httpd_resp_sendstr_chunk(req, "<script type=\"text/javascript\" src=\"/jquery-3.6.0.min.js\"></script>");
httpd_resp_sendstr_chunk(req, "<script type=\"text/javascript\" src=\"/firework.js\"></script></head>");
///////////////////////////////////////////////// httpd_resp_sendstr_chunk(req, "<body>");
if (!readonly) {
FILE *fd = fopen("/sdcard/html/file_server.html", "r"); httpd_resp_sendstr_chunk(req, "<table class=\"fixed\" border=\"0\" width=100% style=\"font-family: arial\">");
char *chunk = ((struct file_server_data *)req->user_ctx)->scratch; httpd_resp_sendstr_chunk(req, "<tr><td style=\"vertical-align: top;width: 300px;\"><h2>Fileserver</h2></td>"
size_t chunksize; "<td rowspan=\"2\"><table border=\"0\" style=\"width:100%\"><tr><td style=\"width:80px\">"
do { "<label for=\"newfile\">Source</label></td><td colspan=\"2\">"
chunksize = fread(chunk, 1, SERVER_FILER_SCRATCH_BUFSIZE, fd); "<input id=\"newfile\" type=\"file\" onchange=\"setpath()\" style=\"width:100%;\"></td></tr>"
// ESP_LOGD(TAG, "Chunksize %d", chunksize); "<tr><td><label for=\"filepath\">Destination</label></td><td>"
if (chunksize > 0){ "<input id=\"filepath\" type=\"text\" style=\"width:94%;\"></td><td>"
if (httpd_resp_send_chunk(req, chunk, chunksize) != ESP_OK) { "<button id=\"upload\" type=\"button\" class=\"button\" onclick=\"upload()\">Upload</button></td></tr>"
fclose(fd); "</table></td></tr><tr></tr><tr><td colspan=\"2\">"
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "File sending failed!"); "<button style=\"font-size:16px; padding: 5px 10px\" id=\"dirup\" type=\"button\" onclick=\"dirup()\""
return ESP_FAIL; "disabled>&#129145; Directory up</button><span style=\"padding-left:15px\" id=\"currentpath\">"
} "</span></td></tr>");
} httpd_resp_sendstr_chunk(req, "</table>");
} while (chunksize != 0);
fclose(fd); httpd_resp_sendstr_chunk(req, "<script type=\"text/javascript\" src=\"/file_server.js\"></script>");
// ESP_LOGI(TAG, "File sending complete"); httpd_resp_sendstr_chunk(req, "<script type=\"text/javascript\">initFileServer();</script>");
}
///////////////////////////////
std::string _zw = std::string(dirpath); std::string _zw = std::string(dirpath);
_zw = _zw.substr(8, _zw.length() - 8); _zw = _zw.substr(8, _zw.length() - 8);
_zw = "/delete/" + _zw + "?task=deldircontent"; _zw = "/delete/" + _zw + "?task=deldircontent";
// Send file-list table definition and column labels
httpd_resp_sendstr_chunk(req, "<table id=\"files_table\">"
"<col width=\"800px\"><col width=\"300px\"><col width=\"300px\"><col width=\"100px\">"
"<thead><tr><th>Name</th><th>Type</th><th>Size</th>");
/* Send file-list table definition and column labels */
httpd_resp_sendstr_chunk(req,
"<table id=\"files_table\">"
"<col width=\"800px\" /><col width=\"300px\" /><col width=\"300px\" /><col width=\"100px\" />"
"<thead><tr><th>Name</th><th>Type</th><th>Size</th>");
if (!readonly) { if (!readonly) {
httpd_resp_sendstr_chunk(req, "<th>" httpd_resp_sendstr_chunk(req, "<th><form method=\"post\" action=\"");
"<form method=\"post\" action=\"");
httpd_resp_sendstr_chunk(req, _zw.c_str()); httpd_resp_sendstr_chunk(req, _zw.c_str());
httpd_resp_sendstr_chunk(req, httpd_resp_sendstr_chunk(req, "\"><button type=\"submit\">DELETE ALL!</button></form></th></tr>");
"\"><button type=\"submit\">DELETE ALL!</button></form>"
"</th></tr>");
} }
httpd_resp_sendstr_chunk(req, "</thead><tbody>\n"); httpd_resp_sendstr_chunk(req, "</thead><tbody>\n");
/* Iterate over all files / folders and fetch their names and sizes */ // Iterate over all files / folders and fetch their names and sizes
while ((entry = readdir(dir)) != NULL) { while ((entry = readdir(pdir)) != NULL) {
if (strcmp("wlan.ini", entry->d_name) != 0 ) // wlan.ini soll nicht angezeigt werden! // wlan.ini soll nicht angezeigt werden!
{ if (strcmp("wlan.ini", entry->d_name) != 0) {
entrytype = (entry->d_type == DT_DIR ? "directory" : "file"); entrytype = (entry->d_type == DT_DIR ? "directory" : "file");
strlcpy(entrypath + dirpath_len, entry->d_name, sizeof(entrypath) - dirpath_len); strlcpy(entrypath + dirpath_len, entry->d_name, sizeof(entrypath) - dirpath_len);
ESP_LOGD(TAG, "Entrypath: %s", entrypath); ESP_LOGD(TAG, "Entrypath: %s", entrypath);
if (stat(entrypath, &entry_stat) == -1) { if (stat(entrypath, &entry_stat) == -1) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat " + string(entrytype) + ": " + string(entry->d_name)); LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to stat " + std::string(entrytype) + ": " + std::string(entry->d_name));
continue; continue;
} }
@@ -283,22 +277,25 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const
} }
} }
ESP_LOGI(TAG, "Found %s: %s (%s bytes)", entrytype, entry->d_name, entrysize); ESP_LOGD(TAG, "Found %s: %s (%s bytes)", entrytype, entry->d_name, entrysize);
/* Send chunk of HTML file containing table entries with file name and size */ // Send chunk of HTML file containing table entries with file name and size
httpd_resp_sendstr_chunk(req, "<tr><td><a href=\""); httpd_resp_sendstr_chunk(req, "<tr><td><a href=\"");
httpd_resp_sendstr_chunk(req, "/fileserver"); httpd_resp_sendstr_chunk(req, "/fileserver");
httpd_resp_sendstr_chunk(req, uripath); httpd_resp_sendstr_chunk(req, uripath);
httpd_resp_sendstr_chunk(req, entry->d_name); httpd_resp_sendstr_chunk(req, entry->d_name);
if (entry->d_type == DT_DIR) { if (entry->d_type == DT_DIR) {
httpd_resp_sendstr_chunk(req, "/"); httpd_resp_sendstr_chunk(req, "/");
} }
httpd_resp_sendstr_chunk(req, "\">"); httpd_resp_sendstr_chunk(req, "\">");
httpd_resp_sendstr_chunk(req, entry->d_name); httpd_resp_sendstr_chunk(req, entry->d_name);
httpd_resp_sendstr_chunk(req, "</a></td><td>"); httpd_resp_sendstr_chunk(req, "</a></td><td>");
httpd_resp_sendstr_chunk(req, entrytype); httpd_resp_sendstr_chunk(req, entrytype);
httpd_resp_sendstr_chunk(req, "</td><td>"); httpd_resp_sendstr_chunk(req, "</td><td>");
httpd_resp_sendstr_chunk(req, entrysize); httpd_resp_sendstr_chunk(req, entrysize);
if (!readonly) { if (!readonly) {
httpd_resp_sendstr_chunk(req, "</td><td>"); httpd_resp_sendstr_chunk(req, "</td><td>");
httpd_resp_sendstr_chunk(req, "<form method=\"post\" action=\"/delete"); httpd_resp_sendstr_chunk(req, "<form method=\"post\" action=\"/delete");
@@ -306,31 +303,28 @@ static esp_err_t http_resp_dir_html(httpd_req_t *req, const char *dirpath, const
httpd_resp_sendstr_chunk(req, entry->d_name); httpd_resp_sendstr_chunk(req, entry->d_name);
httpd_resp_sendstr_chunk(req, "\"><button type=\"submit\">Delete</button></form>"); httpd_resp_sendstr_chunk(req, "\"><button type=\"submit\">Delete</button></form>");
} }
httpd_resp_sendstr_chunk(req, "</td></tr>\n"); httpd_resp_sendstr_chunk(req, "</td></tr>\n");
} }
} }
closedir(dir);
/* Finish the file list table */ closedir(pdir);
// Finish the file list table
httpd_resp_sendstr_chunk(req, "</tbody></table>"); httpd_resp_sendstr_chunk(req, "</tbody></table>");
/* Send remaining chunk of HTML file to complete it */ // Send remaining chunk of HTML file to complete it
httpd_resp_sendstr_chunk(req, "</body></html>"); httpd_resp_sendstr_chunk(req, "</body></html>");
/* Send empty chunk to signal HTTP response completion */ // Send empty chunk to signal HTTP response completion
httpd_resp_sendstr_chunk(req, NULL); httpd_resp_sendstr_chunk(req, NULL);
return ESP_OK; return ESP_OK;
} }
/*
#define IS_FILE_EXT(filename, ext) \
(strcasecmp(&filename[strlen(filename) - sizeof(ext) + 1], ext) == 0)
*/
static esp_err_t logfileact_get_full_handler(httpd_req_t *req) { static esp_err_t logfileact_get_full_handler(httpd_req_t *req) {
return send_logfile(req, true); return send_logfile(req, true);
} }
static esp_err_t logfileact_get_last_part_handler(httpd_req_t *req) { static esp_err_t logfileact_get_last_part_handler(httpd_req_t *req) {
return send_logfile(req, false); return send_logfile(req, false);
} }
@@ -339,7 +333,6 @@ static esp_err_t datafileact_get_full_handler(httpd_req_t *req) {
return send_datafile(req, true); return send_datafile(req, true);
} }
static esp_err_t datafileact_get_last_part_handler(httpd_req_t *req) { static esp_err_t datafileact_get_last_part_handler(httpd_req_t *req) {
return send_datafile(req, false); return send_datafile(req, false);
} }
@@ -424,7 +417,6 @@ static esp_err_t send_datafile(httpd_req_t *req, bool send_full_file)
return ESP_OK; return ESP_OK;
} }
static esp_err_t send_logfile(httpd_req_t *req, bool send_full_file) static esp_err_t send_logfile(httpd_req_t *req, bool send_full_file)
{ {
LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "log_get_last_part_handler"); LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "log_get_last_part_handler");
@@ -510,7 +502,6 @@ static esp_err_t send_logfile(httpd_req_t *req, bool send_full_file)
return ESP_OK; return ESP_OK;
} }
/* Handler to download a file kept on the server */ /* Handler to download a file kept on the server */
static esp_err_t download_get_handler(httpd_req_t *req) static esp_err_t download_get_handler(httpd_req_t *req)
{ {
@@ -528,7 +519,6 @@ static esp_err_t download_get_handler(httpd_req_t *req)
// filename = get_path_from_uri(filepath, ((struct file_server_data *)req->user_ctx)->base_path, // filename = get_path_from_uri(filepath, ((struct file_server_data *)req->user_ctx)->base_path,
// req->uri, sizeof(filepath)); // req->uri, sizeof(filepath));
if (!filename) { if (!filename) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Filename is too long"); LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Filename is too long");
/* Respond with 414 Error */ /* Respond with 414 Error */
@@ -759,7 +749,6 @@ static esp_err_t upload_post_handler(httpd_req_t *req)
httpd_resp_set_hdr(req, "Location", directory.c_str()); httpd_resp_set_hdr(req, "Location", directory.c_str());
httpd_resp_sendstr(req, "File uploaded successfully"); httpd_resp_sendstr(req, "File uploaded successfully");
return ESP_OK; return ESP_OK;
} }
@@ -770,7 +759,6 @@ static esp_err_t delete_post_handler(httpd_req_t *req)
char filepath[FILE_PATH_MAX]; char filepath[FILE_PATH_MAX];
struct stat file_stat; struct stat file_stat;
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
char _query[200]; char _query[200];
char _valuechar[30]; char _valuechar[30];
@@ -893,13 +881,11 @@ static esp_err_t delete_post_handler(httpd_req_t *req)
} }
} }
httpd_resp_set_hdr(req, "Location", directory.c_str()); httpd_resp_set_hdr(req, "Location", directory.c_str());
httpd_resp_sendstr(req, "File successfully deleted"); httpd_resp_sendstr(req, "File successfully deleted");
return ESP_OK; return ESP_OK;
} }
void delete_all_in_directory(std::string _directory) void delete_all_in_directory(std::string _directory)
{ {
struct dirent *entry; struct dirent *entry;
@@ -1137,8 +1123,6 @@ void unzip(std::string _in_zip_file, std::string _target_directory){
ESP_LOGD(TAG, "Success."); ESP_LOGD(TAG, "Success.");
} }
void register_server_file_uri(httpd_handle_t server, const char *base_path) void register_server_file_uri(httpd_handle_t server, const char *base_path)
{ {
static struct file_server_data *server_data = NULL; static struct file_server_data *server_data = NULL;
@@ -1164,8 +1148,6 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
strlcpy(server_data->base_path, base_path, strlcpy(server_data->base_path, base_path,
sizeof(server_data->base_path)); sizeof(server_data->base_path));
/* URI handler for getting uploaded files */ /* URI handler for getting uploaded files */
// char zw[sizeof(serverprefix)+1]; // char zw[sizeof(serverprefix)+1];
// strcpy(zw, serverprefix); // strcpy(zw, serverprefix);
@@ -1180,7 +1162,6 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
}; };
httpd_register_uri_handler(server, &file_download); httpd_register_uri_handler(server, &file_download);
httpd_uri_t file_datafileact = { httpd_uri_t file_datafileact = {
.uri = "/datafileact", // Match all URIs of type /path/to/file .uri = "/datafileact", // Match all URIs of type /path/to/file
.method = HTTP_GET, .method = HTTP_GET,
@@ -1189,7 +1170,6 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
}; };
httpd_register_uri_handler(server, &file_datafileact); httpd_register_uri_handler(server, &file_datafileact);
httpd_uri_t file_datafile_last_part_handle = { httpd_uri_t file_datafile_last_part_handle = {
.uri = "/data", // Match all URIs of type /path/to/file .uri = "/data", // Match all URIs of type /path/to/file
.method = HTTP_GET, .method = HTTP_GET,
@@ -1206,7 +1186,6 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
}; };
httpd_register_uri_handler(server, &file_logfileact); httpd_register_uri_handler(server, &file_logfileact);
httpd_uri_t file_logfile_last_part_handle = { httpd_uri_t file_logfile_last_part_handle = {
.uri = "/log", // Match all URIs of type /path/to/file .uri = "/log", // Match all URIs of type /path/to/file
.method = HTTP_GET, .method = HTTP_GET,
@@ -1215,7 +1194,6 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
}; };
httpd_register_uri_handler(server, &file_logfile_last_part_handle); httpd_register_uri_handler(server, &file_logfile_last_part_handle);
/* URI handler for uploading files to server */ /* URI handler for uploading files to server */
httpd_uri_t file_upload = { httpd_uri_t file_upload = {
.uri = "/upload/*", // Match all URIs of type /upload/path/to/file .uri = "/upload/*", // Match all URIs of type /upload/path/to/file
@@ -1233,5 +1211,4 @@ void register_server_file_uri(httpd_handle_t server, const char *base_path)
.user_ctx = server_data // Pass server data as context .user_ctx = server_data // Pass server data as context
}; };
httpd_register_uri_handler(server, &file_delete); httpd_register_uri_handler(server, &file_delete);
} }

View File

@@ -0,0 +1,50 @@
h1 {font-size: 2em;}
h2 {font-size: 1.5em; margin-block-start: 0.0em; margin-block-end: 0.2em;}
h3 {font-size: 1.2em;}
p {font-size: 1em;}
#files_table {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
#files_table td, #files_table th {
border: 1px solid #ddd;
padding: 8px;
}
#files_table tr:nth-child(even){
background-color: #f2f2f2;
}
#files_table tr:hover {
background-color: #ddd;
}
#files_table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color:lightgrey;
color: black;
}
input[type=file] {
padding: 5px 0px;
display: inline-block;
font-size: 16px;
}
input[type=text] {
padding: 5px 10px;
display: inline-block;
border: 1px solid #ccc;
font-size: 16px;
}
.button {
padding: 4px 10px;
width: 100px;
font-size: 16px;
}

View File

@@ -1,206 +0,0 @@
<!DOCTYPE html>
<html lang="en" xml:lang="en">
<head>
<link href="/firework.css?v=$COMMIT_HASH" rel="stylesheet">
<script type="text/javascript" src="/jquery-3.6.0.min.js?v=$COMMIT_HASH"></script>
<script type="text/javascript" src="/firework.js?v=$COMMIT_HASH"></script>
<style>
h1 {font-size: 2em;}
h2 {font-size: 1.5em; margin-block-start: 0.0em; margin-block-end: 0.2em;}
h3 {font-size: 1.2em;}
p {font-size: 1em;}
#files_table {
font-family: Arial, Helvetica, sans-serif;
border-collapse: collapse;
width: 100%;
}
#files_table td, #files_table th {
border: 1px solid #ddd;
padding: 8px;
}
#files_table tr:nth-child(even){
background-color: #f2f2f2;
}
#files_table tr:hover {
background-color: #ddd;
}
#files_table th {
padding-top: 12px;
padding-bottom: 12px;
text-align: left;
background-color:lightgrey;
color: black;
}
input[type=file] {
padding: 5px 0px;
display: inline-block;
font-size: 16px;
}
input[type=text] {
padding: 5px 10px;
display: inline-block;
border: 1px solid #ccc;
font-size: 16px;
}
.button {
padding: 4px 10px;
width: 100px;
font-size: 16px;
}
</style>
</head>
</body>
<table class="fixed" border="0" width=100% style="font-family: arial">
<tr>
<td style="vertical-align: top;width: 300px;">
<h2>Fileserver</h2>
</td>
<td rowspan="2">
<table border="0" style="width:100%">
<tr>
<td style="width:80px">
<label for="newfile">Source</label>
</td>
<td colspan="2">
<input id="newfile" type="file" onchange="setpath()" style="width:100%;">
</td>
</tr>
<tr>
<td>
<label for="filepath">Destination</label>
</td>
<td>
<input id="filepath" type="text" style="width:94%;">
</td>
<td>
<button id="upload" type="button" class="button" onclick="upload()">Upload</button>
</td>
</tr>
</table>
</td>
</tr>
<tr></tr>
<tr>
<td colspan="2">
<button style="font-size:16px; padding: 5px 10px" id="dirup" type="button" onclick="dirup()" disabled>&#129145; Directory up</button>
<span style="padding-left:15px" id="currentpath"></span>
</td>
</tr>
</table>
<script type="text/javascript" src="/common.js?v=$COMMIT_HASH"></script>
<script type="text/javascript">
function setpath() {
var fileserverpraefix = "/fileserver";
var anz_zeichen_fileserver = fileserverpraefix.length;
var default_path = window.location.pathname.substring(anz_zeichen_fileserver) + document.getElementById("newfile").files[0].name;
document.getElementById("filepath").value = default_path;
}
function dirup() {
var str = window.location.href;
str = str.substring(0, str.length-1);
var zw = str.indexOf("/");
var found = zw;
while (zw >= 0)
{
zw = str.indexOf("/", found+1);
if (zw >= 0)
found = zw;
}
var res = str.substring(0, found+1);
window.location.href = res;
}
function upload() {
var filePath = document.getElementById("filepath").value;
var upload_path = "/upload/" + filePath;
var fileInput = document.getElementById("newfile").files;
/* Max size of an individual file. Make sure this
* value is same as that set in file_server.c */
var MAX_FILE_SIZE = 8000*1024;
var MAX_FILE_SIZE_STR = "8000KB";
if (fileInput.length == 0) {
firework.launch('No file selected!', 'danger', 30000);
} else if (filePath.length == 0) {
firework.launch('File path on server is not set!', 'danger', 30000);
} else if (filePath.length > 100) {
firework.launch('Filename is to long! Max 100 characters.', 'danger', 30000);
} else if (filePath.indexOf(' ') >= 0) {
firework.launch('File path on server cannot have spaces!', 'danger', 30000);
} else if (filePath[filePath.length-1] == '/') {
firework.launch('File name not specified after path!', 'danger', 30000);
} else if (fileInput[0].size > MAX_FILE_SIZE) {
firework.launch("File size must be less than " + MAX_FILE_SIZE_STR + "!", 'danger', 30000);
} else {
document.getElementById("newfile").disabled = true;
document.getElementById("filepath").disabled = true;
document.getElementById("upload").disabled = true;
var file = fileInput[0];
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
document.open();
document.write(xhttp.responseText);
document.close();
firework.launch('File upload completed', 'success', 5000);
} else if (xhttp.status == 0) {
firework.launch('Server closed the connection abruptly!', 'danger', 30000);
UpdatePage(false);
} else {
firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000);
UpdatePage(false);
}
}
};
xhttp.open("POST", upload_path, true);
xhttp.send(file);
}
}
function checkAtRootLevel(res) {
if (getPath() == "/fileserver/") { // Already at root level
document.getElementById("dirup").disabled = true;
console.log("Already on sd-card root level!");
return true;
}
document.getElementById("dirup").disabled = false;
return false;
}
function getPath() {
return window.location.pathname.replace(/\/+$/, '') + "/"
}
checkAtRootLevel();
console.log("Current path: " + getPath().replace("/fileserver", ""));
document.getElementById("currentpath").innerHTML = "Current path: <b>" + getPath().replace("/fileserver", "") + "</b>";
document.cookie = "page=" + getPath() + "; path=/";
</script>
</body>
</html>

View File

@@ -0,0 +1,93 @@
function setpath() {
var fileserverpraefix = "/fileserver";
var anz_zeichen_fileserver = fileserverpraefix.length;
var default_path = window.location.pathname.substring(anz_zeichen_fileserver) + document.getElementById("newfile").files[0].name;
document.getElementById("filepath").value = default_path;
}
function dirup() {
var str = window.location.href;
str = str.substring(0, str.length-1);
var zw = str.indexOf("/");
var found = zw;
while (zw >= 0) {
zw = str.indexOf("/", found+1);
if (zw >= 0) {
found = zw;
}
}
var res = str.substring(0, found+1);
window.location.href = res;
}
function upload() {
var filePath = document.getElementById("filepath").value;
var upload_path = "/upload/" + filePath;
var fileInput = document.getElementById("newfile").files;
// Max size of an individual file. Make sure this value is same as that set in file_server.c
var MAX_FILE_SIZE = 8000*1024;
var MAX_FILE_SIZE_STR = "8000KB";
if (fileInput.length == 0) {
firework.launch('No file selected!', 'danger', 30000);
} else if (filePath.length == 0) {
firework.launch('File path on server is not set!', 'danger', 30000);
} else if (filePath.length > 100) {
firework.launch('Filename is to long! Max 100 characters.', 'danger', 30000);
} else if (filePath.indexOf(' ') >= 0) {
firework.launch('File path on server cannot have spaces!', 'danger', 30000);
} else if (filePath[filePath.length-1] == '/') {
firework.launch('File name not specified after path!', 'danger', 30000);
} else if (fileInput[0].size > MAX_FILE_SIZE) {
firework.launch("File size must be less than " + MAX_FILE_SIZE_STR + "!", 'danger', 30000);
} else {
document.getElementById("newfile").disabled = true;
document.getElementById("filepath").disabled = true;
document.getElementById("upload").disabled = true;
var file = fileInput[0];
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4) {
if (xhttp.status == 200) {
document.open();
document.write(xhttp.responseText);
document.close();
firework.launch('File upload completed', 'success', 5000);
} else if (xhttp.status == 0) {
firework.launch('Server closed the connection abruptly!', 'danger', 30000);
UpdatePage(false);
} else {
firework.launch('An error occured: ' + xhttp.responseText, 'danger', 30000);
UpdatePage(false);
}
}
};
xhttp.open("POST", upload_path, true);
xhttp.send(file);
}
}
function checkAtRootLevel(res) {
if (getPath() == "/fileserver/") {
// Already at root level
document.getElementById("dirup").disabled = true;
console.log("Already on sd-card root level!");
return true;
}
document.getElementById("dirup").disabled = false;
return false;
}
function getPath() {
return window.location.pathname.replace(/\/+$/, '') + "/"
}
function initFileServer() {
checkAtRootLevel();
console.log("Current path: " + getPath().replace("/fileserver", ""));
document.getElementById("currentpath").innerHTML = "Current path: <b>" + getPath().replace("/fileserver", "") + "</b>";
document.cookie = "page=" + getPath() + "; path=/";
}