【发布时间】:2021-11-03 12:06:10
【问题描述】:
我有一个代码,可以在其中接收数组中的加密数据。我正在努力使用 curl mime api 创建多部分/表单数据。任何人都可以帮助我/指导我如何创建多部分/表单数据。谢谢你。我是 curl 的新手,以前从未使用过 curl。我收到一条错误消息“无法从文件/应用程序打开/读取本地数据”。
#include <string>
#include <vector>
#include <iostream>
#include <curl/curl.h>
#include <curl/easy.h>
#define SYSLOG_INFO std::clog
struct Post {
std::string url, chunk;
static constexpr auto HeaderSize = 10;
size_t static callBackFunk(char* buffer, size_t size, size_t nitmes,
void* userdata)
{ /*ignore?*/
SYSLOG_INFO << __PRETTY_FUNCTION__ << "\n";
return 0;
}
std::string libcurl(const std::vector<uint8_t>& cmdData)
{
CURL* curl{nullptr};
CURLcode res;
curl_mime* form = NULL;
curl_mimepart* field = NULL;
struct curl_slist* headers = NULL;
static const char buf[] = "Expect:";
std::string data = std::string(cmdData.begin(), cmdData.end());
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
form = curl_mime_init(curl);
field = curl_mime_addpart(form);
curl_mime_name(field, "upfile");
curl_mime_filedata(field, data.c_str());
field = curl_mime_addpart(form);
curl_mime_name(field, "filename");
curl_mime_filedata(field, data.c_str());
std::string header =
std::string(cmdData.begin(), cmdData.begin() + HeaderSize);
SYSLOG_INFO << "header = " << header << std::endl;
std::string headerAuth = "SCPv2: " + header;
headers = curl_slist_append(headers, headerAuth.c_str());
headers = curl_slist_append(headers, buf);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, (std::string*)&chunk);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, callBackFunk);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cout << stderr << " curl_easy_perform() failed "
<< curl_easy_strerror(res) << std::endl;
}
curl_easy_cleanup(curl);
curl_mime_free(form);
curl_slist_free_all(headers);
return chunk;
}
};
int main() {
Post post {"http://www.example.com", "hello world"};
post.libcurl({1,2,3,4});
}
命令
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "cache-control:", CURLFORM_COPYCONTENTS, "no-cache", CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "content-type:", CURLFORM_COPYCONTENTS, "multipart/form-data", CURLFORM_END);
curl_formadd(&formpost, &lastptr, CURLFORM_COPYNAME, "file", CURLFORM_BUFFER, "data", CURLFORM_BUFFERPTR, cmdData.data(), CURLFORM_BUFFERLENGTH, cmdData.size(), CURLFORM_END);
【问题讨论】:
-
mcve 请。不清楚
cmdData里面是什么,或者payload是什么等等…… -
对不起,我更新了代码。
-
不,这个例子甚至不能编译
-
@pptaszni 为您自成一体
标签: c++ curl https multipartform-data libcurl