乐鑫技术交流
直播中

张霞

8年用户 1102经验值
私信 关注
[问答]

ESP8266如何上传比较大的文件?

如题,我在使用ESP8266进行联网操作,SDK例程中有一个例子:esp_http_client。
      我想使用里面的POST操作,上传一个比较大的文件(在TF卡里,有几百K),文件大小超过了8266的RAM,想问下这种情况应该怎么处理?
Code: Select all
    // POST
    const char *post_data = "field1=value1&field2=value2";
    esp_http_client_set_url(client, "http://httpbin.org/post");
    esp_http_client_set_method(client, HTTP_METHOD_POST);
    esp_http_client_set_post_field(client, post_data, strlen(post_data))
    err = esp_http_client_perform(client);
    if (err == ESP_OK) {
        ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",
                esp_http_client_get_status_code(client),
                esp_http_client_get_content_length(client));
    } else {
        ESP_LOGE(TAG, "HTTP POST request failed: %d", err);
    }

                                                                                    

回帖(1)

张虎豹

2024-7-9 16:02:50
在这种情况下,您可以使用分块上传(chunked upload)的方法来上传较大的文件。分块上传允许您将文件分成较小的部分,然后逐个发送。这样,您可以避免一次性将整个文件加载到ESP8266的RAM中。以下是实现分块上传的步骤:

1. 初始化HTTP客户端并设置URL、方法等参数。

```c
esp_http_client_init(client);
esp_http_client_set_url(client, "http://httpbin.org/post");
esp_http_client_set_method(client, HTTP_METHOD_POST);
```

2. 设置请求头,使用"Transfer-Encoding: chunked"来告诉服务器我们将使用分块上传。

```c
esp_http_client_set_header(client, "Transfer-Encoding", "chunked");
```

3. 打开文件并逐块读取。您可以使用`fopen`、`fread`等函数来操作文件。

```c
FILE *file = fopen("/path/to/your/file", "rb");
if (file == NULL) {
    // 处理文件打开失败的情况
}
```

4. 逐块读取文件内容并发送。您可以设置一个合适的块大小,例如1024字节。

```c
#define CHUNK_SIZE 1024
char buffer[CHUNK_SIZE];
size_t len;

while ((len = fread(buffer, 1, CHUNK_SIZE, file)) > 0) {
    // 发送数据
    esp_http_client_write(client, buffer, len);
}
```

5. 发送最后一个空块,表示文件传输完成。

```c
esp_http_client_write(client, "", 0);
```

6. 关闭文件和HTTP客户端。

```c
fclose(file);
esp_http_client_cleanup(client);
```

7. 处理HTTP响应。

请注意,这种方法可能会增加一些传输开销,因为每个块都需要额外的头部信息。但是,它允许您在有限的RAM下上传较大的文件。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分