Skip to content

Commit 06921c4

Browse files
Merge pull request #93 from ESP32Async/example
doc(example): Add PartitionDownloader example
2 parents 7b6253c + aaa9850 commit 06921c4

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

data/README.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
2+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
3+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
4+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
5+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
6+
dapibus elit, id varius sem dui id lacus.</p>
7+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
8+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
9+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
10+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
11+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
12+
dapibus elit, id varius sem dui id lacus.</p>
13+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
14+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
15+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
16+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
17+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
18+
dapibus elit, id varius sem dui id lacus.</p>
19+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
20+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
21+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
22+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
23+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
24+
dapibus elit, id varius sem dui id lacus.</p>
25+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
26+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
27+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
28+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
29+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
30+
dapibus elit, id varius sem dui id lacus.</p>
31+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
32+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
33+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
34+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
35+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
36+
dapibus elit, id varius sem dui id lacus.</p>
37+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
38+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
39+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
40+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
41+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
42+
dapibus elit, id varius sem dui id lacus.</p>
43+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod
44+
rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper
45+
arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit
46+
accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi.
47+
Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo
48+
dapibus elit, id varius sem dui id lacus.
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
// SPDX-License-Identifier: LGPL-3.0-or-later
2+
// Copyright 2016-2025 Hristo Gochkov, Mathieu Carbou, Emil Muratov
3+
4+
//
5+
// - Download ESP32 partition by name and/or type and/or subtype
6+
// - Support encrypted and non-encrypted partitions
7+
//
8+
9+
#include <Arduino.h>
10+
#ifdef ESP32
11+
#include <AsyncTCP.h>
12+
#include <WiFi.h>
13+
#elif defined(ESP8266)
14+
#include <ESP8266WiFi.h>
15+
#include <ESPAsyncTCP.h>
16+
#elif defined(TARGET_RP2040) || defined(TARGET_RP2350) || defined(PICO_RP2040) || defined(PICO_RP2350)
17+
#include <RPAsyncTCP.h>
18+
#include <WiFi.h>
19+
#endif
20+
21+
#include <ESPAsyncWebServer.h>
22+
#include <LittleFS.h>
23+
24+
#ifndef ESP32
25+
// this example is only for the ESP32
26+
void setup() {}
27+
void loop() {}
28+
#else
29+
30+
#include <esp_partition.h>
31+
32+
static AsyncWebServer server(80);
33+
34+
void setup() {
35+
Serial.begin(115200);
36+
37+
#ifndef CONFIG_IDF_TARGET_ESP32H2
38+
WiFi.mode(WIFI_AP);
39+
WiFi.softAP("esp-captive");
40+
#endif
41+
42+
LittleFS.begin(true);
43+
44+
// To upload the FS partition, run:
45+
// > pio run -e arduino-3 -t buildfs
46+
// > pio run -e arduino-3 -t uploadfs
47+
//
48+
// Examples:
49+
//
50+
// - Download the partition named "spiffs": http://192.168.4.1/partition?label=spiffs
51+
// - Download the partition named "spiffs" with type "data": http://192.168.4.1/partition?label=spiffs&type=1
52+
// - Download the partition named "spiffs" with type "data" and subtype "spiffs": http://192.168.4.1/partition?label=spiffs&type=1&subtype=130
53+
// - Download the partition with subtype "nvs": http://192.168.4.1/partition?type=1&subtype=2
54+
//
55+
// "type" and "subtype" IDs can be found in esp_partition.h header file.
56+
//
57+
// Add "&raw=false" parameter to download the partition unencrypted (for encrypted partitions).
58+
// By default, the raw partition is downloaded, so if a partition is encrypted, the encrypted data will be downloaded.
59+
//
60+
// To browse a downloaded LittleFS partition, you can use https://tniessen.github.io/littlefs-disk-img-viewer/ (block size is 4096)
61+
//
62+
server.on("/partition", HTTP_GET, [](AsyncWebServerRequest *request) {
63+
const AsyncWebParameter *pLabel = request->getParam("label");
64+
const AsyncWebParameter *pType = request->getParam("type");
65+
const AsyncWebParameter *pSubtype = request->getParam("subtype");
66+
const AsyncWebParameter *pRaw = request->getParam("raw");
67+
68+
if (!pLabel && !pType && !pSubtype) {
69+
request->send(400, "text/plain", "Bad request: missing parameter");
70+
return;
71+
}
72+
73+
esp_partition_type_t type = ESP_PARTITION_TYPE_ANY;
74+
esp_partition_subtype_t subtype = ESP_PARTITION_SUBTYPE_ANY;
75+
const char *label = nullptr;
76+
bool raw = true;
77+
78+
if (pLabel) {
79+
label = pLabel->value().c_str();
80+
}
81+
82+
if (pType) {
83+
type = (esp_partition_type_t)pType->value().toInt();
84+
}
85+
86+
if (pSubtype) {
87+
subtype = (esp_partition_subtype_t)pSubtype->value().toInt();
88+
}
89+
90+
if (pRaw && pRaw->value() == "false") {
91+
raw = false;
92+
}
93+
94+
const esp_partition_t *partition = esp_partition_find_first(type, subtype, label);
95+
96+
if (!partition) {
97+
request->send(404, "text/plain", "Partition not found");
98+
return;
99+
}
100+
101+
AsyncWebServerResponse *response =
102+
request->beginChunkedResponse("application/octet-stream", [partition, raw](uint8_t *buffer, size_t maxLen, size_t index) -> size_t {
103+
const size_t remaining = partition->size - index;
104+
if (!remaining) {
105+
return 0;
106+
}
107+
const size_t len = std::min(maxLen, remaining);
108+
if (raw && esp_partition_read_raw(partition, index, buffer, len) == ESP_OK) {
109+
return len;
110+
}
111+
if (!raw && esp_partition_read(partition, index, buffer, len) == ESP_OK) {
112+
return len;
113+
}
114+
return 0;
115+
});
116+
117+
response->addHeader("Content-Disposition", "attachment; filename=" + String(partition->label) + ".bin");
118+
response->setContentLength(partition->size);
119+
120+
request->send(response);
121+
});
122+
123+
server.begin();
124+
}
125+
126+
void loop() {
127+
delay(100);
128+
}
129+
130+
#endif

platformio.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ lib_dir = .
1616
; src_dir = examples/MessagePack
1717
; src_dir = examples/Middleware
1818
; src_dir = examples/Params
19+
; src_dir = examples/PartitionDownloader
1920
src_dir = examples/PerfTests
2021
; src_dir = examples/RateLimit
2122
; src_dir = examples/Redirect

0 commit comments

Comments
 (0)