嵌入式平台無文件系統,需用 CURLFORM_BUFFER 直接上傳內存數據。用 CURLFORM_FILE 可成功在服務器 (HFS) 生成文件,改用 Buffer 後服務器收到數據但**不生成文件**。
CURLFORM_BUFFER 僅提供數據指針,**未指定文件名**,導致 Content-Disposition: form-data; name="sourcedata" 缺少 filename="..." 參數,服務器端解析器拒絕保存。
struct curl_httppost *post = NULL, *last = NULL;
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "sourcedata", // 表單字段名
CURLFORM_BUFFER, "test.bmp", // 關鍵:指定文件名,將出現在 Content-Disposition
CURLFORM_BUFFERPTR, imageData, // 數據指針
CURLFORM_BUFFERLENGTH, 102400, // 數據長度
CURLFORM_END);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
curl_easy_perform(curl);
curl_formfree(post);
| 參數 | 用途 | 是否含文件名 |
|---|---|---|
CURLFORM_FILE | 讀取磁盤文件上傳 | 自動從路徑提取文件名 |
CURLFORM_BUFFER | 上傳內存緩衝區,**必須配合此參數指定文件名** | **由開發者提供** |
CURLFORM_BUFFERPTR | 緩衝區地址 | 否 |
CURLFORM_BUFFERLENGTH | 緩衝區長度 | 否 |
Content-Disposition 頭:name="sourcedata"name="sourcedata"; filename="test.bmp"test.bmp 文件。// 錯誤:curl_slist_append 添加 Content-Disposition 會放在 HTTP 頭部,而非 multipart 部分
struct curl_slist *h = NULL;
h = curl_slist_append(h, "Content-Disposition: form-data; name=\"sourcedata\"; filename=\"test.bmp\"");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, h); // 錯誤位置!
**multipart/form-data 的每個 part 獨立擁有 Header**,只能通過 curl_formadd 參數控制,不可用全局 CURLOPT_HTTPHEADER。
核心修正:**curl_formadd 中添加 CURLFORM_BUFFER, "filename.ext"**,即可在無文件系統平台正常上傳並讓服務器生成指定文件名。