Skip to content

Commit

Permalink
Add exemple Upload Huge File
Browse files Browse the repository at this point in the history
  • Loading branch information
nathannau committed Mar 28, 2024
1 parent de75193 commit 4a3f57e
Show file tree
Hide file tree
Showing 2 changed files with 142 additions and 0 deletions.
13 changes: 13 additions & 0 deletions libraries/WebServer/examples/UploadHugeFile/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Upload Huge File To SD Over Http

This project is an example of an HTTP server designed to facilitate the transfer of large files using the PUT method, in accordance with RFC specifications.

### Example cURL Command

```bash
curl -X PUT -H "Content-Type: application/octet-stream" -T ./my-file.mp3 http://esp-ip/upload/my-file.mp3
```

## Resources

- RFC HTTP/1.0 - Additional Request Methods - PUT : [Link](https://datatracker.ietf.org/doc/html/rfc1945#appendix-D.1.1)
129 changes: 129 additions & 0 deletions libraries/WebServer/examples/UploadHugeFile/UploadHugeFile.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <SD.h>

const char* ssid = "**********";
const char* password = "**********";

WebServer server(80);

File rawFile;
void handleCreate() {
server.send(200, "text/plain", "");
}
void handleCreateProcess() {
String path = server.pathArg(0);
HTTPRaw& raw = server.raw();
if (raw.status == RAW_START) {
if (SD.exists((char *)path.c_str())) {
SD.remove((char *)path.c_str());
}
rawFile = SD.open(path.c_str(), FILE_WRITE);
Serial.print("Upload: START, filename: ");
Serial.println(path);
} else if (raw.status == RAW_WRITE) {
if (rawFile) {
rawFile.write(raw.buf, raw.currentSize);
}
Serial.print("Upload: WRITE, Bytes: ");
Serial.println(raw.currentSize);
} else if (raw.status == RAW_END) {
if (rawFile) {
rawFile.close();
}
Serial.print("Upload: END, Size: ");
Serial.println(raw.totalSize);
}
}

void printDirectory() {
if (!server.hasArg("dir")) {
return returnFail("BAD ARGS");
}
String path = server.arg("dir");
if (path != "/" && !SD.exists((char *)path.c_str())) {
return returnFail("BAD PATH");
}
File dir = SD.open((char *)path.c_str());
path = String();
if (!dir.isDirectory()) {
dir.close();
return returnFail("NOT DIR");
}
dir.rewindDirectory();
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send(200, "text/json", "");
WiFiClient client = server.client();

server.sendContent("[");
for (int cnt = 0; true; ++cnt) {
File entry = dir.openNextFile();
if (!entry) {
break;
}

String output;
if (cnt > 0) {
output = ',';
}

output += "{\"type\":\"";
output += (entry.isDirectory()) ? "dir" : "file";
output += "\",\"name\":\"";
output += entry.path();
output += "\"";
output += "}";
server.sendContent(output);
entry.close();
}
server.sendContent("]");
dir.close();
}

void handleNotFound() {
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}

void setup(void) {
Serial.begin(115200);

while (!SD.begin()) delay();
Serial.println("SD Card initialized.");

WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

server.on(UriRegex("/upload/(.*)"), HTTP_PUT, handleCreate, handleCreateProcess);
server.onNotFound(handleNotFound);
server.begin();
server.println("HTTP server started");

}

void loop(void) {
server.handleClient();
delay(2);//allow the cpu to switch to other tasks
}

0 comments on commit 4a3f57e

Please sign in to comment.