libcurl上傳檔案 post from表單、post二進位制的區別
阿新 • • 發佈:2019-02-06
libcurl引數很多,一不小心就容易遇到問題。曾經就遇到過一個很蛋疼的問題:libcurl斷點下載>>
這裡主要彙總一下,libcurl上傳的二種方式:
1、直接上傳檔案,類似form表單<input type=”file” />,<form enctype=”multipart/form-data”…;
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中附加CURLFORM_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.
上面的引數均不可預設,如果預設結果可能不太符合預期。其中Content-Type預設為“application/octet-stream”
CURLFORM_COPYNAME為上傳的欄位名,如上圖所示(name之後)
CURLFORM_BUFFER 在沒有使用CURLFORM_FILE上傳自定義檔案時使用,它用來告訴libcurl檔案內容已經在快取中了,在內容的頭資訊中它提供了filename欄位。我之前沒加這個引數發現一直上傳不成功- -
*** 還有一個地方要注意的是:CURLFORM_BUFFERLENGTH它的型別必須為long
為了方便測試,我使用了node.js的formidable來除錯
參考連結: