cpp libcurl 在 HTTP post 调用中发送 zip 文件,而不使用 multipart\form-da
cpp libcurl send zip file in http post call without using multipartform-data
我们在cpp libcurl中使用formdata使用以下代码将数据发送到我们的服务器:
curl_formadd(&form, &lastptr, CURLFORM_COPYNAME, "file", CURLFORM_FILE, filePath.c_str(), CURLFORM_END);
curl_easy_setopt(curl_handle, CURLOPT_HTTPPOST, form);
但是现在我们的服务器已经更新为接受http请求正文中的二进制文件,而不是multipart\form-data。我发现 curl 命令可以在不使用多部分\表单数据的情况下附加 zipfile,如下所示
curl --request POST --data-binary "@file" $URL
但我在 cpp curl 中找不到它的等价物。我们的要求是在 http 请求中上传一个 zip 文件
您需要设置CURLOPT_READDATA
和CURLOPT_READFUNCTION
选项。 curl 会反复调用CURLOPT_READFUNCTION
你传递的任何内容作为参数CURLOPT_READDATA
,直到它返回 0 或CURL_READFUNC_ABORT
。
默认情况下,libcurl 假定您的 READFUNCTION 从文件句柄读取。 文档显示以下示例:
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userdata)
{
FILE *readhere = (FILE *)userdata;
curl_off_t nread;
/* copy as much data as possible into the 'ptr' buffer, but no more than
'size' * 'nmemb' bytes! */
size_t retcode = fread(ptr, size, nmemb, readhere);
nread = (curl_off_t)retcode;
fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
" bytes from filen", nread);
return retcode;
}
void setup(char *uploadthis)
{
FILE *file = fopen("rb", uploadthis);
CURLcode result;
/* set callback to use */
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
/* pass in suitable argument to callback */
curl_easy_setopt(curl, CURLOPT_READDATA, uploadthis);
result = curl_easy_perform(curl);
}
如果要从内存缓冲区读取,则 READFUNCTION 需要记住某处的偏移量,并在每次调用时memcpy
块,直到它到达内存缓冲区的末尾。
我用POST_FIELDS上传了一个zip文件。将二进制模式下的 zip 文件读入 char 指针并将其传递给,如下所示:
char * buffer;
//read file into buffer
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)total);
curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, buffer);
如果我错了,请纠正我或建议我选择替代方案
相关文章:
- cpp libcurl 在 HTTP post 调用中发送 zip 文件,而不使用 multipart\form-da
- 在使用Qt Designer Form Classes扩展我自己的自定义小部件时防止重复的自动连接
- 来自 Visual C++ Windows Form 项目的 SQL 连接
- QML应用程序编译一个 *form.ui.qml文件,但忽略了关联的.qml文件
- 使用视觉C++设置"Windows Form Application"中的像素值
- HwndHost for Windows Form - Win32 / WinForm Interoperability
- 更改Form.h之外的表单标签文本
- Boost.asio in Visual C++ Form project
- 从头开始实现经典的OPC DA服务器
- Qt "Form Load"功能
- tink_core Future (haxe) form c++
- 正在传递指向全局da的指针
- Visual c++ Form -如何通过单击按钮改变标签的可见属性
- Content-Type: application/x-www-form-urlencoded in curl
- HTTP multipart/form-data发送字符串数组
- 一个简单的web服务器在c++中使用asio和form post从safari似乎不工作
- 我如何上传一个文件或者我们可以说在Visual c++ Form Application中从系统中选择一个文件
- 提升any_range与 "canonical form" - 后者是什么?
- 在form中追加文本