使用libcurl POST數據和上傳文件

  • 爲了具有通用性,將文件的內容讀到了fc變量中,fclen是fc的長度。fc也可以是任何其它內容。curl 是 libcurl句柄。演示省略了很多顯而易見的步驟。

    1. 普通的post請求,這裏用curl_easy_escape對fc做了編碼
    std::string data("req=plain");
    data.append("&file=");
    char *efc = curl_easy_escape(curl, fc, fclen);
    data.append(efc)
    curl_free(encoded);

    curl_easy_setopt(curl, CURLOPT_URL, PURGE_URL);
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data.size());

    2. multipart/formdata請求
    struct curl_httppost *formpost = 0;
    struct curl_httppost *lastptr  = 0;
    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "reqformat", CURLFORM_PTRCONTENTS, "plain", CURLFORM_END);
    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_PTRCONTENTS, fc, CURLFORM_CONTENTSLENGTH, fclen, CURLFORM_END);

    curl_easy_setopt(curl, CURLOPT_URL, URL);
    curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
    curl_easy_perform(curl);
    curl_formfree(formpost);

    3. multipart/formdata請求,不把文件讀入fc,其它步驟相同
    curl_formadd(&formpost, &lastptr, CURLFORM_PTRNAME, "file", CURLFORM_FILE, "/path/filename", CURLFORM_END);

    4. 通過put上傳文件
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
    curl_easy_setopt(curl, CURLOPT_PUT, 1L);
    curl_easy_setopt(curl, CURLOPT_READDATA, fp);   // FILE *fp = fopen("/path/filename");
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, fsize);  // fsize = sizeof /path/filename

    5. 發送自己的Header
    struct curl_slist *slist = 0;
    slist = curl_slist_append(slist, "Blog-X-User: username");
    slist = curl_slist_append(slist, "Blog-X-Signature: signature");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
    curl_slist_free_all(slist);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章