0

我正在尝试将音频文件和文本从 ESP32 发布到服务器。我可以使用 Postman 轻松地完成这种发布请求。 使用 Postman 发布请求 我正在尝试使用 ESP32 做同样的事情。我想从与我的 ESP32 连接的 SD 卡上传一个音频文件和一个简单的文本。但我不知道如何使用 HTTP 发布音频文件,以及如何在同一个发布请求中将文本与音频文件结合起来。任何人都可以帮忙吗?以前我将一些 JSON 数据从 ESP 发送到服务器,使用 HttpClient 和 ArduinoJSON 库非常容易。

4

1 回答 1

1

您可以使用此代码将表单数据发送到 http 服务器:FirstConfigNameProj 是文本数据,fb 是我们的图像文件。

const char *server = "testhost.ir"; // Server URL
if (!client.connect(server, 80))
    Serial.println("Connection failed!");
else
{
    String serverPath1 = "http://testhost.ir/api/Camera";
    String serverName1 = "testhost.ir";

    Serial.println("Connection successful!" + enid);
    String bound = "boundry";
    String FirstConfigNameProj = "--" + bound + "\r\nContent-Disposition: form-data; name=\"fkProject\"" + "\r\n\r\n" + String(prjNo) + "\r\n";

    String head = "--" + bound + "\r\nContent-Disposition: form-data; name=\"cameraImage\";filename=\"IMAGE19.JPG\"\r\nContent-Type: image/jpeg\r\n\r\n";
    String tail = "\r\n--" + bound + "--\r\n";

    uint32_t imageLen = fb->len;
    uint32_t extraLen = head.length() + tail.length();
    uint32_t totalLen = imageLen + extraLen;
    Serial.println("first step");
    client.println("POST " + serverPath1 + " HTTP/1.1");
    client.println("Host: " + serverName1);

    // content length
    uint32_t contentLength = FirstConfigNameProj.length() + totalLen;

    // send post header

    client.println("Content-Length: " + String(contentLength));
    client.println("Content-Type: multipart/form-data; boundary=" + bound);
    client.println();
    char charBufKey[FirstConfigNameProj.length() + 1];
    FirstConfigNameProj.toCharArray(charBufKey, FirstConfigNameProj.length() + 1);
    client.write(charBufKey);
    client.println();
    client.print(head);
    Serial.println("second step");
    uint8_t *fbBuf = fb->buf;
    size_t fbLen = fb->len;
    for (size_t n = 0; n < fbLen; n = n + 1024)
    {
        if (n + 1024 < fbLen)
        {
            client.write(fbBuf, 1024);
            fbBuf += 1024;
        }
        else if (fbLen % 1024 > 0)
        {
            size_t remainder = fbLen % 1024;
            client.write(fbBuf, remainder);
        }
    }
    client.print(tail);

    esp_camera_fb_return(fb);

    int timoutTimer = 10000;
    long startTimer = millis();
    boolean state = false;

    Serial.println("third step");
    while ((startTimer + timoutTimer) > millis())
    {
        Serial.print(".");
        delay(100);
        while (client.available())
        {
            char c = client.read();
            if (c == '\n')
            {
                if (getAll.length() == 0)
                {
                    state = true;
                }
                getAll = "";
            }
            else if (c != '\r')
            {
                getAll += String(c);
            }
            if (state == true)
            {
                getBody += String(c);
            }
            startTimer = millis();
        }
        if (getBody.length() > 0)
        {
            break;
        }
    }
    client.stop();
    Serial.println(getBody);
}
于 2021-07-10T09:38:25.380 回答