我如何使用curl c ++源发布wav文件数据,如何在c ++中使用--data-binary?

问题描述 投票:0回答:1

我想发送带有curl的wav文件。我可以使用带有终端命令的--data-binary发送wav文件。但是我无法用c++ source发送WAV文件。

我使用过Linux,ubuntu 18.04

--data-binary的curl_easy_setopt是什么?

我的代码在下面。

我想发送带有curl的wav文件。我可以使用带有终端命令的--data-binary发送wav文件。但是我无法用c++ source发送WAV文件。

我使用过Linux,ubuntu 18.04

--data-binary的curl_easy_setopt是什么?

我的代码在下面。

#include <iostream>
#include <string>
#include <curl/curl.h>
#include <fstream>

int main(void)
{

    std::string contents;
    std::ifstream in("test2.wav", std::ios::in | std::ios::binary);

    if (in)
    {
        in.seekg(0, std::ios::end);
        contents.resize(in.tellg());
        in.seekg(0, std::ios::beg);
        in.read(&contents[0], contents.size());
        in.close();
    }


    CURL *curl;
    CURLcode res;

    struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;
    struct curl_slist *headerlist = NULL;
    static const char buf[] =  "Expect:";

    curl_global_init(CURL_GLOBAL_ALL);

    // set up the header
    curl_formadd(&formpost,
        &lastptr,
        CURLFORM_COPYNAME, "cache-control:",
        CURLFORM_COPYCONTENTS, "no-cache",
        CURLFORM_END);

    curl_formadd(&formpost,
        &lastptr,
        CURLFORM_COPYNAME, "content-type:",
        CURLFORM_COPYCONTENTS, "audio/wav",
        CURLFORM_END);


    curl = curl_easy_init();

    headerlist = curl_slist_append(headerlist, buf);
    if (curl) {

        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Content-Type: audio/wav");

        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, contents.data());
        curl_easy_setopt(curl, CURLOPT_POST,1);
        curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:9080");

        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

        res = curl_easy_perform(curl);
        /* Check for errors */
        if (res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));


        curl_easy_cleanup(curl);

        curl_formfree(formpost);

        curl_slist_free_all(headerlist);
    }
    return 0;
}
c++ file curl libcurl wav
1个回答
0
投票

[--data-binaryCURLOPT_POSTFIELDS,但您在这里犯了几个错误:

  • 您的代码试图将“ multipart / form-data” POST请求和常规POST请求混合在一起,结果可能是服务器无法解析的乱码。下定决心,使用普通的POST请求,使用OR使用多部分/表单数据请求,但不要在同一请求中混合使用2(这就是您的代码正在执行的操作),以便对其进行修复删除所有formpost代码,您不需要此处的多部分请求。

  • 您正在尝试发送一个二进制文件,该文件可能(几乎可以肯定)包括NULL字节,默认情况下curl将使用strlen()检查要发送的数据的大小,该文件在第一个空字节处停止,因此您的转移将是不完整的。使用CURLOPT_POSTFIELDSIZE_LARGE告诉curl您的二进制文件有多少个字节。

  • 即使没有创建curl句柄,您也将返回成功代码。 (我认为我一开始阅读时遇到3个问题,但现在我只看到2个,嗯)

© www.soinside.com 2019 - 2024. All rights reserved.