簡體   English   中英

如何使用 libcurl 定義元數據?

[英]How to define metadata with libcurl?

我使用curl (命令行工具)執行以下命令將文件上傳到谷歌驅動器:

curl --request POST \
    'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart' \
    --header 'Authorization: Bearer "..."' \
    -F "metadata={name : 'backup.zip'};type=application/json;charset=UTF-8" \
    -F "@backup.zip;type=application/zip"

以下帶有libcurl程序只能使用URLheader並使用 formdata 上傳文件:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if(curl) {


        struct curl_slist *chunk= NULL;
        chunk= curl_slist_append(chunk, "Authorization: Bearer \"...\"");
        curl_slist_append(chunk, "Accept: application/json");
        curl_slist_append(chunk, "Content-Type: application/json");

        curl_mimepart *part= NULL;
        curl_mime_type(part, "application/octet-stream");


        struct curl_httppost* formpost = NULL;
        struct curl_httppost* lastptr = NULL;
        curl_formadd(&formpost,
                     &lastptr,
                     CURLFORM_COPYNAME, "sendfile",
                     CURLFORM_FILE, "main.c",
                     CURLFORM_END);


        /* Perform the request, res will get the return code */
        //curl_easy_setopt(curl, CURLOPT_URL, "https://www.googleapis.com/drive/v3/files");
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
        curl_easy_setopt(curl, CURLOPT_MIMEPOST, part);
        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

        curl_easy_perform(curl);

        /* always cleanup */
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();


    return 0;
}

如何在libcurl指定-F "metadata={name : 'backup.zip'};type=application/json;charset=UTF-8"

我用CURLFORM_COPYNAME嘗試過,但這不起作用。

您將 HTTP 請求的頂級Content-Type標頭設置為application/json ,這是錯誤的。 根據谷歌的文檔,它需要是multipart/related的: 發送多部分上傳請求

您顯示的命令行將application/json類型的 MIME 部分插入到 POST 表單數據中,但您在代碼中沒有做同樣的事情。

此外,您不應將CURLOPT_MIMEPOSTCURLOPT_HTTPPOST一起使用。 使用 ONE 或 OTHER,而不是兩者。 CURLOPT_HTTPPOST已棄用,取而代之的CURLOPT_MIMEPOST 無論如何,您甚至沒有將正確的輸入值CURLOPT_MIMEPOSTCURLOPT_MIMEPOST 它需要curl_mime* ,而不是curl_mimepart*

嘗試更像這樣的事情:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if (curl)
    {
        /* set custom HTTP headers */

        struct curl_slist *header = NULL;

        // uncomment this if you are not using libcurl 7.61.0 or later...
        //
        // header = curl_slist_append(header, "Authorization: Bearer \"...\"");
        //

        header = curl_slist_append(header, "Content-Type: multipart/related");
        header = curl_slist_append(header, "Accept: application/json");

        /* set MIME post content */

        curl_mime *mime = curl_mime_init(curl);

        curl_mimepart *part = curl_mime_addpart(mime);
        curl_mime_name(part, "metadata");
        curl_mime_type(part, "application/json;charset=UTF-8");
        curl_mime_data(part, "{\"name\" : \"backup.zip\"}", CURL_ZERO_TERMINATED);

        part = curl_mime_addpart(mime);
        curl_mime_type(part, "application/zip");
        curl_mime_filedata(part, "backup.zip");

        /* Perform the request, res will get the return code */

        curl_easy_setopt(curl, CURLOPT_URL, "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
        curl_easy_setopt(curl, CURLOPT_POST, 1); 
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
        curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);

        // comment this out if you are not using libcurl 7.61.0 or later...
        //
        curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);
        curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "...");
        //

        res = curl_easy_perform(curl);

        /* always cleanup */
        curl_slist_free_all(header);
        curl_mime_free(mime);
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();

    return 0;
}

或者可能是這樣(我不確定在使用 MIME 正文時指定 HTTP Content-Type的正確方法 - 關於此主題的文檔和示例非常有限,我發現的大多數示例都是針對 SMTP,而不是 HTTP):

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    if (curl)
    {
        /* set custom HTTP headers */

        struct curl_slist *header = NULL;

        // uncomment this if you are not using libcurl 7.61.0 or later...
        //
        // header = curl_slist_append(header, "Authorization: Bearer \"...\"");
        //

        header = curl_slist_append(header, "Accept: application/json");

        /* set MIME post content */

        curl_mime *mime = curl_mime_init(curl);

        curl_mime *rel = curl_mime_init(curl);

        curl_mimepart *part = curl_mime_addpart(rel);
        curl_mime_name(part, "metadata");
        curl_mime_type(part, "application/json;charset=UTF-8");
        curl_mime_data(part, "{\"name\" : \"backup.zip\"}", CURL_ZERO_TERMINATED);

        part = curl_mime_addpart(rel);
        curl_mime_type(part, "application/zip");
        curl_mime_filedata(part, "backup.zip");

        part = curl_mime_addpart(mime);
        curl_mime_type(part, "multipart/related"); 
        curl_mime_subparts(part, rel); 

        /* Perform the request, res will get the return code */

        curl_easy_setopt(curl, CURLOPT_URL, "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart");
        curl_easy_setopt(curl, CURLOPT_POST, 1); 
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header);
        curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);

        // comment this out if you are not using libcurl 7.61.0 or later...
        //
        curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BEARER);
        curl_easy_setopt(curl, CURLOPT_XOAUTH2_BEARER, "...");
        //

        res = curl_easy_perform(curl);

        /* always cleanup */
        curl_slist_free_all(header);
        curl_mime_free(mime);
        curl_easy_cleanup(curl);
    }

    curl_global_cleanup();

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM