ESPAsyncWebServer : how to send a file ?

christianw
Posts: 7
Joined: Fri Apr 21, 2023 8:55 am

ESPAsyncWebServer : how to send a file ?

Postby christianw » Thu Apr 04, 2024 7:38 pm

I have an ESP32 with an ESPAsyncWebServer which records data in a table (3600 rows maximum)

How do I get the web server to send the data as a CSV file to the browser?
Thanks in advance

lbernstone
Posts: 798
Joined: Mon Jul 22, 2019 3:20 pm

Re: ESPAsyncWebServer : how to send a file ?

Postby lbernstone » Thu Apr 04, 2024 9:42 pm

If you are just sending a file from the flash, you can use the serveStatic method.
https://github.com/me-no-dev/ESPAsyncWe ... le-by-name
The mime type would be "text/csv".
I would recommend you add a max-age header at the frequency that you are collecting the data.

christianw
Posts: 7
Joined: Fri Apr 21, 2023 8:55 am

Re: ESPAsyncWebServer : how to send a file ?

Postby christianw » Fri Apr 05, 2024 4:18 am

lbernstone wrote:
Thu Apr 04, 2024 9:42 pm
If you are just sending a file from the flash
Thanks but... datas are in RAM : I have a array to store them :

Code: Select all

struct SDATA {
  float temp;
  long  tmillis;
};

SDATA TabMesures[3600];

lbernstone
Posts: 798
Joined: Mon Jul 22, 2019 3:20 pm

Re: ESPAsyncWebServer : how to send a file ?

Postby lbernstone » Fri Apr 05, 2024 5:33 am

I assume this is data that you actually want to log anyhow. Write it to a file, and then staticServe that file.
If you want a lightweight data logger that's a bit more sophisticated, take a look at rrdTool

christianw
Posts: 7
Joined: Fri Apr 21, 2023 8:55 am

Re: ESPAsyncWebServer : how to send a file ?

Postby christianw » Fri Apr 05, 2024 6:47 am

I prefer not to save the data permanently but to transmit it either for downloading or for display (using chart.js for example).

boarchuz
Posts: 600
Joined: Tue Aug 21, 2018 5:28 am

Re: ESPAsyncWebServer : how to send a file ?

Postby boarchuz » Fri Apr 05, 2024 6:48 am

CSV is very basic, you could construct it on-the-fly from memory (assuming ESPAsyncWebServer exposes the right stuff to make it possible).

It could be as simple as this (pseudocode obviously):

Code: Select all

http_server.on(HTTP_GET, "/data.csv") {
    response.header.set("Content-Type", "text/csv");
    // TODO: set Content-Length or use chunked encoding
    response.begin();
    for(int row = 0; row < ARRAY_SIZE(TabMesures); ++row) {
        char buffer[20];
        sprintf(buffer, "%.2f", TabMesures[row].temp);
        response.send(buffer);
        response.send(',');
        sprintf(buffer, "%ld", TabMesures[row].tmillis);
        response.send(buffer);
        response.send('\n');
    }
    response.end();
}

christianw
Posts: 7
Joined: Fri Apr 21, 2023 8:55 am

Re: ESPAsyncWebServer : how to send a file ?

Postby christianw » Fri Apr 05, 2024 7:13 am

I'll try this later, thanks.
But

Code: Select all

sprintf(buffer, "%.2f",...) 
won't work with an ESP32. I'll change to

Code: Select all

dtostrf()
but that's a detail.
On the other hand, I'm more worried about the RAM taken up: about 50 kB for the whole CSV :-(

lbernstone
Posts: 798
Joined: Mon Jul 22, 2019 3:20 pm

Re: ESPAsyncWebServer : how to send a file ?

Postby lbernstone » Fri Apr 05, 2024 8:44 am

You can do a printf directly into the response method in a for loop. This will stream it, and likely is breaking it into mtu-sized chunks to deliver on the line.

Who is online

Users browsing this forum: No registered users and 34 guests