Как загрузить картинку на самый важный сервер с помощью libcurl? - PullRequest
0 голосов
/ 05 ноября 2019

Попытка создать приложение C ++ для загрузки изображений на самый важный сервер (версия 5.14.0). И у меня есть токен доступа, идентификатор канала с помощью моего кода C ++. Но я не могу загрузить изображение с помощью libcurl. Это мой код CPP (сейчас используется libcurl):

void uploadPicture(string url,string channelId, string path,string fileName,string token)
{
    url += "/api/v4/files";

    CURL *curl;

    struct curl_httppost *formpost = NULL;
    struct curl_httppost *lastptr = NULL;

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "files",
        CURLFORM_FILE, path.c_str(),
        CURLFORM_FILENAME,"test.jpg",
        CURLFORM_CONTENTTYPE, "image/jpeg",
        CURLFORM_END);

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "client_ids",
        CURLFORM_COPYCONTENTS, "test.jpg",
        CURLFORM_END);

    curl_formadd(&formpost, &lastptr,
        CURLFORM_COPYNAME, "channel_id",
        CURLFORM_COPYCONTENTS, channelId.c_str(),
        CURLFORM_END);

    struct curl_slist *headers = NULL;

    string auth = "Authorization:Bearer ";
    auth += token;
    headers = curl_slist_append(headers, "Content-Type:multipart/form-data");
    headers = curl_slist_append(headers, auth.c_str());
    CURLcode res;
    curl = curl_easy_init();

    if (curl)
    {
        res = curl_easy_setopt(curl, CURLOPT_URL, url.c_str());         
        res = curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);      
        res = curl_easy_setopt(curl, CURLOPT_HTTPPOST,formpost);         
        res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getFileInfo);
        res = curl_easy_setopt(curl, CURLOPT_POST, 1);                
        res = curl_easy_perform(curl);  
        if (res != 0)
        {
            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
        }
    }

}

Но это не сработает ... Скажите, пожалуйста, где проблема.

1 Ответ

0 голосов
/ 08 ноября 2019

Наконец-то. Я нахожу решение:

void uploadByMimeApi(string url, string channelId, string path, string fileName, string token)
{
    url += "/api/v4/files";

    CURL *curl = curl_easy_init();
    curl_mime *mime;
    curl_mimepart *part;
    curl_mimepart *part2;
    curl_mimepart *part3;

    /* Build an HTTP form */
    mime = curl_mime_init(curl);
    part = curl_mime_addpart(mime);

    curl_mime_name(part, "files");
    curl_mime_filedata(part, path.c_str());
    curl_mime_type(part, "image/jpeg");

    part2 = curl_mime_addpart(mime);
    curl_mime_data(part2, channelId.c_str(), CURL_ZERO_TERMINATED);
    curl_mime_name(part2, "channel_id");

    part3 = curl_mime_addpart(mime);
    curl_mime_data(part3, "test", CURL_ZERO_TERMINATED);
    curl_mime_name(part3, "client_ids");

    //header issue
    struct curl_slist *headers = NULL;
    static const char buf[] = "Expect:";
    string auth = "Authorization:Bearer ";
    auth += token;
    headers = curl_slist_append(headers, auth.c_str());
    headers = curl_slist_append(headers, buf);

    /* Post and send it. */
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getFileInfo);
    curl_easy_perform(curl);

    /* Clean-up. */
    curl_easy_cleanup(curl);
    curl_mime_free(mime);
}
...