首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

libcurl POST 上傳文件:CURLFORM_BUFFER 指定文件名解決無文件系統平台問題

     編輯:程式設計綜合問答

場景

嵌入式平台無文件系統,需用 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緩衝區長度否

驗證方法

  1. Wireshark 抓包對比 Content-Disposition 頭:
    修正前:name="sourcedata"
    修正後:name="sourcedata"; filename="test.bmp"
  2. 服務器端 (HFS) 目錄下出現 test.bmp 文件。

補充:手動設置 Header 的錯誤做法

// 錯誤: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"**,即可在無文件系統平台正常上傳並讓服務器生成指定文件名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved