curl:使用带有POST参数的多部分表单

3
如果我这样做
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_params);

服务器不会看到多部分内容,但如果我注释掉第二行代码,它就能看到了。
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
//curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_params);

可以了。

这里有什么问题?

更新:现在的问题是,是否可以给参数赋值,以便该值在服务器端的POST参数数组中?我正在尝试。

    headers = curl_slist_append(headers, "Content-Disposition: form-data");

    //action=upload
    curl_formadd(&formpost,
        &lastptr,
        CURLFORM_COPYNAME, "action",
        CURLFORM_COPYCONTENTS, "upload",
        CURLFORM_CONTENTHEADER, headers,
        CURLFORM_CONTENTTYPE, "Content-Type: multipart/form-data",
        CURLFORM_END);

但这并不起作用!

提前感谢您!


post_params="action=upload&clientID=" + clientId - Eugeny89
2
好的,那不是一个多部分消息,而是 application/x-www-form-urlencoded。你的字符串必须是一个有效的多部分消息,并且你必须设置正确的 Content-Type: 头(可能是 multipart/form-data)... 我建议你阅读这篇文章了解多部分消息的工作原理。 - DaveRandom
@DaveRandom,这意味着我必须以某种方式对“post_params”进行编码吗? - Eugeny89
1
这意味着你必须用一种不同的方式创建 post_params。该字符串看起来完全不同。在阅读我之前提供的维基百科文章之前,请参考其中一个多部分消息的示例,并链接到您需要阅读有关标准如何工作的所有内容。 - DaveRandom
1
重点不在于如何传递字符串,而是在于如何首先创建字符串。您需要至少一个变量“boundary”,其中包含一个随机边界字符串以分隔消息部分。然后,您需要创建一个类似于“post_params =“--” + boundary +”\ r \ nContent-Disposition:form-data; name = \“action \”\ r \ n \ r \ nupload \ r \ n--” + boundary + ”\ r \ nContent-Disposition:form-data; name = \“clientID \”\ r \ n \ r \ n“+ clientId +”\ r \ n--” + boundary +“--”“的字符串-按照多部分消息标准所示的格式。 - DaveRandom
显示剩余2条评论
1个回答

2
我最终主要是遵循这里的示例代码:http://curl.haxx.se/libcurl/c/multi-post.html 以下是基于Curl示例链接的工作正常的代码样例:
... 
CURL *curl;
curl_mime *form;

curl = curl_easy_init();

/*  Set the headers for the request. */
scoped_curl_slist headers;
headers.list = NULL;
string session_header = "Authorization: Bearer " + token;
headers.list = curl_slist_append(headers.list, session_header.c_str());
headers.list = curl_slist_append(headers.list, "cache-control: no-cache");
headers.list = curl_slist_append(headers.list, "Content-Type: multipart/form-data");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers.list);

curl_easy_setopt(curl, CURLOPT_URL, "your_url.com");

/* Create the form */
form = curl_mime_init(curl);

/* Fill in the file upload field */
curl_mimepart *field = curl_mime_addpart(form);
curl_mime_name(field, "upload");
curl_mime_filedata(field, "C:/file_name.txt");

/* Fill in the filename field */
field = curl_mime_addpart(form);
curl_mime_name(field, "name");
curl_mime_data(field, "file_name.txt", CURL_ZERO_TERMINATED);
curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);

CURLcode result = curl_easy_perform(curl);
...
curl_mime_free(form);
curl_easy_cleanup(curl);
curl_slist_free_all(headers);

我尝试了这个... 表单没有边界就发送了,导致了一个错误的请求。 - user5125586

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接