【问题标题】:libcurl HTTP request set content-disposition and content-type in MIME dataMIME 数据中的 libcurl HTTP 请求集 content-disposition 和 content-type
【发布时间】:2020-10-21 20:57:32
【问题描述】:

我正在尝试使用 libcurl 在 Twitter 上上传图片,我使用 twurl 命令行工具生成 HTTP 请求并查看它的外观,我得到的是这样的:

POST /1.1/media/upload.json HTTP/1.1
Accept: */
Content-Type: multipart/form-data, boundary="00Twurl342528555775455418lruwT99"
Authorization: OAuth oauth_body_hash="XXX", oauth_consumer_key="XXX", oauth_nonce="XXX", oauth_signature="XXX", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1603308767", oauth_token="XXX", oauth_version="1.0"
Connection: close
Host: upload.twitter.com
Content-Length: 612739
--00Twurl342528555775455418lruwT99
Content-Disposition: form-data; name="media"; filename="image.png"
Content-Type: application/octet-stream


binary data of image.png

--00Twurl342528555775455418lruwT99--

目前我可以通过 libcurl 生成的请求(使用 curl verbose 获得)是这个:

POST /1.1/media/upload.json HTTP/2
Host: upload.twitter.com
accept: */*
authorization: OAuth oauth_consumer_key="XXX",oauth_nonce="XXX",oauth_signature="XXX",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1603372043",oauth_token="XXX",oauth_version="1.0"
content-length: 268
content-type: multipart/form-data; boundary=------------------------d1b0fc28e693c24a

使用以下代码:

curl_mime     *mime = nullptr;
curl_mimepart *part = nullptr;

mime = curl_mime_init(request_handle);
part = curl_mime_addpart(mime);

curl_mime_name(part, "media");
curl_mime_filename(part, "image.png");

curl_easy_setopt(request_handle, CURLOPT_MIMEPOST, mime);

问题是我不知道如何使用 libcurl 使我的请求类似于第一个请求,我如何指定 Content-TypeContent-Disposition

编辑:解决方案

完整代码

curl_mime*     mime = nullptr;
curl_mimepart* part = nullptr;

/* initialize mime part */
mime = curl_mime_init(request_handle);
part = curl_mime_addpart(mime);

/* content-disposition: form-data; name="media"; filename="image.png" */
curl_mime_name(part, "media");
curl_mime_filename(part, "image.png");

/* add file content */
curl_mime_filedata(part, "image.png");

/* content-type: application/octet-stream */
curl_mime_type(part, "application/octet-stream");

/* link the MIME data to your curl handle */
curl_easy_setopt(request_handle, CURLOPT_MIMEPOST, mime);

我不是为了突出要使用的函数,而是检查函数返回。

【问题讨论】:

标签: c++ c http libcurl


【解决方案1】:

如何指定Content-TypeContent-Disposition

只需阅读精美手册(您可以从精美示例 postit2.c 导航到该手册)

CURLcode curl_mime_type(curl_mimepart * part, const char * mimetype);

curl_mime_type 设置 mime 部分的内容类型

CURLcode curl_mime_filename(curl_mimepart * part, const char * filename);

curl_mime_filename 设置 mime 部分的远程文件名。设置远程文件名时,无论部件的内容源是什么,内容数据都会作为文件处理。部件的远程文件名在关联的 Content-Disposition 生成的标头中传输到服务器。

官方的 libcurl tutorial 也不错。

【讨论】:

  • 感谢您的回复,这就是我实际在做的事情(没有更新我的问题),问题是我执行的是 GET 请求而不是 POST。为此浪费了2天..接受了您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 2011-06-18
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多