libcurlアップロードファイルpost fromフォーム、postバイナリの違い


http://blog.csdn.net/leekumbong/article/details/29182299
libcurlはパラメータが多くて、ちょっと油断すると問題になりやすいです.卵が痛いという問題に遭遇したことがあります.libcurl断点ダウンロード.
 
ここでは主に、libcurlアップロードの2つの方法をまとめます.
1、ファイルを直接アップロードして、フォームと似ています.
2.バイナリストリームをアップロードする;
 
カスタムヘッドを設定するには、同じ方法を使います.
struct curl_slist *headers=NULL;
headers = curl_slist_append(headers, "Content-Type: text/xml");
headers = curl_slist_append(headers, "Accept: text/html, */*;q=0.01");
//...

//set headers
curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);


//last free the header list
curl_slist_free_all(headers); /* free the header list */
公式サイトに行ってCURLOPT_を確認します.HTTPHEADER>>
 
直接ファイルをアップロード:
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
 
curl_formadd(&formpost, &lastptr,
    CURLFORM_COPYNAME, "uploadfile",
    CURLFORM_FILE, "/",//imagepath
    CURLFORM_CONTENTTYPE, "Image/jpeg",
    CURLFORM_END);
 
curl_formadd(&formpost, &lastptr,
    CURLFORM_COPYNAME, "filename",
    CURLFORM_COPYCONTENTS, "test.jpg",
    CURLFORM_END);
 
curl_easy_setopt(m_curl,CURLOPT_HTTPPOST,formpost);
 
//last free post
curl_formfree(formpost);
他のファイルタイプをアップロードすると、curl_にあります.formaddにCURL FORMを付加します.CONTENTTYPEパラメータ(Content-Type/Mime-Type)
バイナリストリームアップロード:
//referer http://curl.haxx.se/mail/lib-2003-08/0190.html
curl_formadd(&post, &last,
             CURLFORM_COPYNAME, "file",
             CURLFORM_BUFFER, "unnamed.png",
             CURLFORM_BUFFERPTR, memblock,    
             CURLFORM_BUFFERLENGTH, memblock_length,
             CURLFORM_CONTENTTYPE, "image/png",
             CURLFORM_END);

 
file' is the name of this part, 'unnamed.png' is the name set in the file name field.
上のパラメータはすべてデフォルトではいけません.デフォルトの結果は予想に合わないかもしれません.その中でConteet Typeはデフォルトで「aplication/octet stream」です.
libcurl上传文件 post from表单、post二进制的区别_第1张图片
CURL FORMCOPYNAMEはアップロードされたフィールド名で、上の図のように(nameの後)
CURL FORMBUFER  CURL FORMは使用していません.FILEはユーザー定義のファイルをアップロードする時に使用して、libcurlファイルの内容はすでにキャッシュにありました.コンテンツのヘッダ情報にfilenameフィールドが提供されています.このパラメータを入れていませんが、アップロードが失敗しています.
もう一つ注意したいところがあります.CURL FORMです.BUFFERLENGTHそのタイプはlongでなければなりません.
 
テストを便利にするために、node.jsのformidableを使ってデバッグしました.
 
 
参照リンク:
http://curl.haxx.se/libcurl/c/curl_formadd.
http://curl.haxx.se/libcurl/c/libcurl-tutorial.html
http://curl.haxx.se/libcurl/c/postit2.html
http://stackoverflow.com/questions/14685196/c-libcurl-force-content-type
http://zengrong.net/post/2088.htm
http://stackoverflow.com/questions/25370991/libcurl-buffered-file-upload-not-working
HTTPプロトコルでファイルをアップロードする
libcurl POSTデータとアップロードファイルを使う