#include <stdio.h>
#include <string.h>
#include "esp_http_client.h"
#define FILE_URL "http://example.com/file.txt"
#define FILE_PATH "/spiffs/downloaded_file.txt"
esp_err_t http_event_handler(esp_http_client_event_t *evt)
{
switch(evt->event_id) {
case HTTP_EVENT_ERROR:
printf("HTTP_EVENT_ERROR\n");
break;
case HTTP_EVENT_ON_CONNECTED:
printf("HTTP_EVENT_ON_CONNECTED\n");
break;
case HTTP_EVENT_HEADER_SENT:
printf("HTTP_EVENT_HEADER_SENT\n");
break;
case HTTP_EVENT_ON_HEADER:
printf("HTTP_EVENT_ON_HEADER, key=%s, value=%s\n", evt->header_key, evt->header_value);
break;
case HTTP_EVENT_ON_DATA:
printf("HTTP_EVENT_ON_DATA, len=%d\n", evt->data_len);
if (!esp_http_client_is_chunked_response(evt->client)) {
// Write received data to a file
FILE* f = fopen(FILE_PATH, "a");
if (f == NULL) {
printf("Failed to open file for writing\n");
return ESP_FAIL;
}
fwrite(evt->data, 1, evt->data_len, f);
fclose(f);
}
break;
case HTTP_EVENT_ON_FINISH:
printf("HTTP_EVENT_ON_FINISH\n");
break;
case HTTP_EVENT_DISCONNECTED:
printf("HTTP_EVENT_DISCONNECTED\n");
break;
}
return ESP_OK;
}
void download_file_task(void *pvParameters)
{
esp_http_client_config_t config = {
.url = FILE_URL,
.event_handler = http_event_handler,
};
esp_http_client_handle_t client = esp_http_client_init(&config);
// Set up file to store the downloaded data
FILE* f = fopen(FILE_PATH, "w");
if (f == NULL) {
printf("Failed to create file for writing\n");
return;
}
fclose(f);
esp_err_t err = esp_http_client_perform(client);
if (err == ESP_OK) {
printf("File downloaded successfully\n");
} else {
printf("File download failed\n");
}
esp_http_client_cleanup(client);
vTaskDelete(NULL);
}
void app_main()
{
// Initialize SPIFFS file system (if necessary)
xTaskCreate(&download_file_task, "download_file_task", 4096, NULL, 5, NULL);
}
此示例使用ESP-IDF的HTTP客户端库(esp_http_client)来下载文件。您需要将FILE_URL更改为要下载的文件的URL,并将FILE_PATH更改为要将文件保存到的路径。在示例中,我使用SPIFFS文件系统,并在app_main函数中添加了初始化SPIFFS的注释。您可以根据自己的需求进行修改。