From 9c68d80781d9919c28de53b2bc9ebae1067fd778 Mon Sep 17 00:00:00 2001 From: Brendan O'Leary Date: Tue, 16 Dec 2025 21:20:45 -0500 Subject: [PATCH] Fix issue with uploading to subfolders --- src/CrossPointWebServer.cpp | 9 ++++++--- src/screens/WifiScreen.cpp | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/CrossPointWebServer.cpp b/src/CrossPointWebServer.cpp index 33b0a75..b99f2ba 100644 --- a/src/CrossPointWebServer.cpp +++ b/src/CrossPointWebServer.cpp @@ -721,7 +721,6 @@ static const char* FILES_PAGE_FOOTER = R"rawliteral( const formData = new FormData(); formData.append('file', file); - formData.append('path', currentPath); const progressContainer = document.getElementById('progress-container'); const progressFill = document.getElementById('progress-fill'); @@ -732,7 +731,9 @@ static const char* FILES_PAGE_FOOTER = R"rawliteral( uploadBtn.disabled = true; const xhr = new XMLHttpRequest(); - xhr.open('POST', '/upload', true); + // Include path as query parameter since multipart form data doesn't make + // form fields available until after file upload completes + xhr.open('POST', '/upload?path=' + encodeURIComponent(currentPath), true); xhr.upload.onprogress = function(e) { if (e.lengthComputable) { @@ -1241,7 +1242,9 @@ void CrossPointWebServer::handleUpload() { uploadSuccess = false; uploadError = ""; - // Get upload path from form data (defaults to root if not specified) + // Get upload path from query parameter (defaults to root if not specified) + // Note: We use query parameter instead of form data because multipart form + // fields aren't available until after file upload completes if (server->hasArg("path")) { uploadPath = server->arg("path"); // Ensure path starts with / diff --git a/src/screens/WifiScreen.cpp b/src/screens/WifiScreen.cpp index 1700c02..5aa89b7 100644 --- a/src/screens/WifiScreen.cpp +++ b/src/screens/WifiScreen.cpp @@ -581,7 +581,7 @@ void WifiScreen::renderConnected() const { std::string webInfo = "Web: http://" + connectedIP + "/"; renderer.drawCenteredText(UI_FONT_ID, top + 70, webInfo.c_str(), true, REGULAR); - renderer.drawCenteredText(SMALL_FONT_ID, pageHeight - 30, "Press any button to continue", true, REGULAR); + renderer.drawCenteredText(SMALL_FONT_ID, pageHeight - 30, "Press any button to exit", true, REGULAR); } void WifiScreen::renderSavePrompt() const {