#define FFS LittleFS
, see here for the code: https://github.com/sillyfrog/PrettyLights2/blob/master/src/main.cppcurl
if you are running the SPIFFSEditor
(which this code is obviously, and it works with LittleFS
with the right config, despite the name).
Hey guys, I have the simplest possible server setup with only one handler
server.on("/", HTTP_ANY, [](AsyncWebServerRequest *request) {
Serial.printf("Socials ANY\n");
request->send(200);
});
Sending an OPTIONS request to this doesn't trigger either that handler OR any not found handler I set up. The request just times out
//AsyncCallbackWebHandler& on(const char* uri, WebRequestMethodComposite method, ArRequestHandlerFunction onRequest, ArUploadHandlerFunction onUpload);
web_server.on("/flash_firmware", HTTP_POST,
[](AsyncWebServerRequest *request) {
Serial.println("in request handler");
//"update" is the name of the file input <input type='file' name='update'>
if (request->hasParam("update", true, true)) {
Serial.print("request handler - filesize: ");
Serial.println(String(request->getParam("update", true, true)->size()).c_str());
upload_file_size = request->getParam("update", true, true)->size();
}
},
[](AsyncWebServerRequest *request, const String &filename, size_t index, uint8_t *data, size_t len, bool final) {
Serial.println("in upload handler");
//"update" is the name of the file input <input type='file' name='update'>
if (request->hasParam("update", true, true)) {
Serial.print("(1) upload handler - filesize: ");
Serial.println(String(request->getParam("update", true, true)->size()).c_str());
upload_file_size = request->getParam("update", true, true)->size();
}
Serial.print("(2) upload handler - filesize: ");
Serial.println(upload_file_size);
//handle_flash_firmware(request, filename, index, data, len, final);
});
@me-no-dev I am trying to use `errorToString'
aClient->onError([](void * arg, AsyncClient * client, err_t error) {
ESP_LOGE( TAG, "aSyncClient error %i", error);
ESP_LOGE( TAG, "aSyncClient error code %s", errorToString(error)));
aClient = NULL;
delete client;
}, NULL);
but get this message:
In file included from /home/cellie/Arduino/hardware/espressif/esp32/cores/esp32/esp32-hal.h:45:0,
from /home/cellie/Arduino/hardware/espressif/esp32/cores/esp32/Arduino.h:35,
from /dev/shm/build/arduino/sketch/aSync_client.ino.cpp:1:
/home/cellie/Desktop/aSync_client/aSync_client.ino: In lambda function:
aSync_client:53:68: error: 'errorToString' was not declared in this scope
ESP_LOGE( TAG, "aSyncClient error code %s", errorToString(error)));
aClient->onError([](void * arg, AsyncClient * client, err_t error) {
ESP_LOGE( TAG, "aSyncClient error %i", error);
ESP_LOGE( TAG, "aSyncClient error code %s", client->errorToString(error));
aClient = NULL;
delete client;
}, NULL);
<form id='flash' method='POST' action='/flash_firmware' enctype='multipart/form-data'>
<!--need to upload filesize first because Content-Length [request->contentLength()] isn't the actual file size-->
<input id='filesize' name="filesize" value="0" style="display:none">
<input id='file' type='file' name='update'>
<p></p>
<input id='flash_btn' type='submit' value='Flash'>
</form>
<script>
document.querySelector('form').addEventListener('submit', (e) => {
document.getElementById('filesize').value = document.getElementById('file').files[0].size;
});
</script>
Hi!
I want to write a file upload handler class.
My current class is
class UpdateMasterRequestHandler : public AsyncWebHandler {
public:
UpdateMasterRequestHandler(/* args */) { }
virtual ~UpdateMasterRequestHandler() { }
bool canHandle(AsyncWebServerRequest *request);
void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final);
};
canHandle
returns true, but handleUpload
never gets called.
What am I doing wrong?
bool UpdateMasterRequestHandler::canHandle(AsyncWebServerRequest *request) {
bool forMe = request->url() == "/api/UpdateMaster"
&& request->method() == HTTP_POST
&& request->multipart();
if (forMe) logDebugln("UpdateMasterRequestHandler!");
return forMe;
}
void UpdateMasterRequestHandler::handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {
if (index == 0) {
logDebug("UploadStart: ");
logDebugln(filename);
request->_tempFile = SPIFFS.open("master.hex", "w");
}
if (len > 0) {
request->_tempFile.write(data, len);
}
if (final) {
logDebug("UploadEnd: ");
logDebugln(filename);
request->_tempFile.close();
request->send(200, MIME_TYPE_PLAIN_TEXT, "Upload complete!");
}
}
HTML:<form id="masterUpdateForm" action="/api/UpdateMaster" method="POST" enctype="multipart/form-data">
Firmware: <input type="file" name="file" accept="*.hex">
<button type="submit">Update</button>
</form>
class UpdateMasterRequestHandler : public AsyncWebHandler {
public:
UpdateMasterRequestHandler(/* args */) { }
virtual ~UpdateMasterRequestHandler() { }
virtual bool canHandle(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;
};