C++ 如何使用libcurl(在C+;+;)正确设置多部分formdata以上载二进制文件

C++ 如何使用libcurl(在C+;+;)正确设置多部分formdata以上载二进制文件,c++,file-upload,multipartform-data,libcurl,C++,File Upload,Multipartform Data,Libcurl,提供一点背景资料。我对以太网通信不是很有经验,因此我提前对此表示歉意。我正在做一个项目,我需要弄清楚如何上传二进制文件 我正在尝试将一个大的二进制文件(~34MB)上载到嵌入式设备。我有一个Python代码片段,但是我尝试用C++在不同的应用程序中实现相同的功能。使用WiReSARK,我已经从Python程序中捕获了头文件,它和我在C++代码中所用的头文件一样工作,它不按需要工作。 使用Python成功上传 以下是有效的python代码: response = session.post('htt

提供一点背景资料。我对以太网通信不是很有经验,因此我提前对此表示歉意。我正在做一个项目,我需要弄清楚如何上传二进制文件

我正在尝试将一个大的二进制文件(~34MB)上载到嵌入式设备。我有一个Python代码片段,但是我尝试用C++在不同的应用程序中实现相同的功能。使用WiReSARK,我已经从Python程序中捕获了头文件,它和我在C++代码中所用的头文件一样工作,它不按需要工作。 使用Python成功上传

以下是有效的python代码:

response = session.post('http://10.42.42.1:81/__FileUpload',
         files={"upfile": open(filename, 'rb')},
         stream=False)
以下是从消息中提取的头信息,该消息启动成功的文件上载:

POST /__FileUpload HTTP/1.1
Host: 10.42.42.1:81
Content-Length: 34112690
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.7.0 CPython/2.7.13 Windows/10
Connection: keep-alive
Content-Type: multipart/form-data; boundary=6a659e345a35419e99b66546c1bd9d4e

--6a659e345a35419e99b66546c1bd9d4e
Content-Disposition: form-data; name="upfile"; filename="TestFile.bin"
<> >强> C++代码<0/强>

没有成功 下面是我用来用C++上传文件的代码的要点:

curl_mime *multipart;
curl_mimepart *part;

// Specify the target URL
std::string str(comms.BaseURL() + kFileUploadEndpoint);
curl_easy_setopt(pCurl, CURLOPT_URL, str.c_str());

multipart = curl_mime_init(pCurl);
part = curl_mime_addpart(multipart);
curl_mime_name(part, "upfile");
curl_mime_data(part, ("filename=\"" + FileName + "\"").c_str(), CURL_ZERO_TERMINATED);
part = curl_mime_addpart(multipart);
curl_mime_data_cb(part, fileSize, ReadCallback, SeekCallback, NULL, pFile);
curl_easy_setopt(pCurl, CURLOPT_MIMEPOST, multipart);
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 90L);
res = curl_easy_perform(pCurl);
...

这里是运行C++代码的标题信息:

--------------------------4977715f070a13da
Content-Disposition: form-data; name="upfile"

filename="TestFile.bin"
--------------------------4977715f070a13da
Content-Disposition: form-data
我意识到上面的标题不包含URL端点等等,并注意到消息显然被分成了两部分。以下是在上述消息之前发送的消息的标题内容

POST /__FileUpload HTTP/1.1
Host: 10.42.42.1:81
Accept: */*
Content-Length: 31546130
Content-Type: multipart/form-data; boundary=------------------------4977715f070a13da
Expect: 100-continue
我可以在上传过程中检查嵌入式设备的状态,我特别注意到的一点是,当使用python成功上传时,嵌入式设备会在状态内容回复中报告正在上传的文件名。但是,当我运行C++代码时,当我检查状态时文件名是空白的。因此,嵌入式设备显然不能从C++消息中提取文件名。 嵌入式设备在寻找什么

虽然我无法访问该设备的源代码,但我确实从有权访问的人那里获得了以下信息。他表示,这正是嵌入式设备所寻找的。它并没有帮助我找出如何让事情运转起来,但它可能会帮助其他在这方面更有知识的人

<FORM METHOD=POST name="install" enctype="multipart/form-data" target="HiddenFrame" action="/__FileUpload" onsubmit="InstallAction(); return true;">
    File to upload: <INPUT TYPE=FILE NAME="upfile" size=50><p>
    <INPUT TYPE=SUBMIT VALUE="Submit" >
    </FORM>

要上载的文件:
我更喜欢使用libcurl的“curl\u mime\u…”方法来设置文件上载,因为建议使用这种方法而不是使用旧的HTTPPOST方法。但是,如果使用较旧的HTTPPOST方法更容易,我完全可以。我只是想让它工作

提前感谢您抽出时间

curl\u mime\u数据(部分,(“文件名=\”“+文件名+\”).c\u str(),curl\u ZERO\u终止)

我假定这是要设置mime部件的文件名,然后您应该使用,因为文件名不是数据。每个部分都有名称和数据,但也有元数据,如文件名。当然,仅设置文件名需要单独设置数据

如果您更希望设置数据和文件名,请改为使用


另外,看看官方的libcurl示例。

我最终找到了解决方案。
这里张贴的是任何可以使用它的人:

curl_mime *multipart;
curl_mimepart *part;

multipart = curl_mime_init(pCurl);
part = curl_mime_addpart(multipart);
curl_mime_name(part, "upfile");
curl_mime_filename(part, FileName.c_str());
curl_mime_data_cb(part, lSize, ReadCallback, SeekCallback, NULL, pFile);
part = curl_mime_addpart(multipart);

curl_easy_setopt(pCurl, CURLOPT_MIMEPOST, multipart);

// Now send the message
res = curl_easy_perform(pCurl);

// Free the post data
curl_mime_free(multipart);
...

什么是额外部分=curl\u mime\u addpart(多部分);在curl_mime_data_cb(part、lSize、ReadCallback、SeekCallback、NULL、pFile)之后?