Как опубликовать данные файла wav с помощью curl c ++ source, как я могу использовать --data-binary с c ++? - PullRequest
0 голосов
/ 29 сентября 2019

Я хотел бы отправить WAV-файл с curl.я могу отправить файл WAV, используя --data-binary с терминальной командой.Но мне не удалось отправить WAV-файл с c++ source.

Я использовал Linux, Ubuntu 18.04

Что такое curl_easy_setopt для --data-binary ??

Мой код нижездесь ..

Я хотел бы отправить WAV-файл с curl.Я могу отправить файл WAV, используя --data-binary с терминальной командой.Но я не смог отправить wav файл с c++ source.

Я использовал Linux, Ubuntu 18.04

Что такое curl_easy_setopt для --data-binary ??

Мой код нижездесь ..

#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;
}

1 Ответ

0 голосов
/ 29 сентября 2019

--data-binary равно CURLOPT_POSTFIELDS, но вы делаете здесь пару ошибок:

  • ваш код пытается смешать POST-запрос "multipart / form-data"и обычный запрос POST вместе, результат, вероятно, искаженный беспорядок, который сервер не может проанализировать.решите, используйте обычный запрос POST, ИЛИ используйте запрос multipart / form-data, но не смешивайте 2 в одном запросе (это то, что делает ваш код), чтобы исправитьон просто удаляет весь код formpost, здесь вам не нужен многокомпонентный запрос.

  • вы пытаетесь отправить двоичный файл, который может (и почти наверняка) содержит NULL-bytes, по умолчанию curl будет использовать strlen () для проверки размера отправляемых данных, который останавливается на первом нулевом байте, поэтому ваша передача будет неполной.используйте CURLOPT_POSTFIELDSIZE_LARGE, чтобы указать curl, сколько байтов содержит ваш двоичный файл.

  • вы возвращаете код успеха, даже если дескриптор curl не может быть создан.(я думал, что видел 3 проблемы при чтении этого сначала, но теперь я вижу только 2, хмм)

...