cpp libcurl 在不使用 multipart\form-data 的情况下在 http post 调用中发送 zip 文件
cpp libcurl send zip file in http post call without using multipart\form-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 命令可以在不使用 multipart\form-data 的情况下附加 zipfile,如下所示
curl --request POST --data-binary "@file" $URL
但我在 cpp curl 中找不到它的等价物。我们的要求是在http请求中上传一个zip文件
您需要设置 CURLOPT_READDATA
和 CURLOPT_READFUNCTION
选项。
Curl 将重复调用 CURLOPT_READFUNCTION
并将您作为 CURLOPT_READDATA
作为参数传递的任何内容,直到它 returns 0 或 CURL_READFUNC_ABORT
.
默认情况下,libcurl 假定您的 READFUNCTION 从文件句柄读取。
documentation 显示以下示例:
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 file\n", 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 中的 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 命令可以在不使用 multipart\form-data 的情况下附加 zipfile,如下所示
curl --request POST --data-binary "@file" $URL
但我在 cpp curl 中找不到它的等价物。我们的要求是在http请求中上传一个zip文件
您需要设置 CURLOPT_READDATA
和 CURLOPT_READFUNCTION
选项。
Curl 将重复调用 CURLOPT_READFUNCTION
并将您作为 CURLOPT_READDATA
作为参数传递的任何内容,直到它 returns 0 或 CURL_READFUNC_ABORT
.
默认情况下,libcurl 假定您的 READFUNCTION 从文件句柄读取。 documentation 显示以下示例:
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 file\n", 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);
如有错误请指正或建议我替代