项目背景:linux系统设备,对接第三方平台 需要先上传抓拍记录(JSON格式)、然后上传抓拍图片
项目中问题:上传form-data表单格式的图片数据,抓包报文一直为空
//图片上传抓包报文如下
POST /api/park/imageupload HTTP/1.1
Host: 127.0.0.1
Accept: */*
Content-Type: multipart/form-data
问题原因:上传抓拍记录和抓拍图片共用了一个接口(url进行区分),但未将JSON格式数据上传的POST方法与form-data格式的HTTPPOST方法区分开,导致form-data格式的post方式被覆盖了 未生效;
//修改前
if (null != strstr(url, "imageupload"))
{
/* form-data格式的post请求 */
(VOID)curl_easy_setopt(pstCurl, CURLOPT_HTTPPOST, pstFormpost);
}
else
{
}
/* Json格式的post请求 */
(VOID)curl_easy_setopt(pstCurl, CURLOPT_POST, 1);
=============================================
//修改后
if (null != strstr(url, "imageupload"))
{
/* form-data格式的post请求 */
(VOID)curl_easy_setopt(pstCurl, CURLOPT_HTTPPOST, pstFormpost);
}
else
{
/* Json格式的post请求 */
(VOID)curl_easy_setopt(pstCurl, CURLOPT_POST, 1);
}
libcurl 库来实现上传 form-data 格式的二进制图片数据,可以按照以下步骤进行。我们将使用 libcurl 来处理 HTTP 请求,并使用 libcurl 的 curl_formadd 函数来构建 form-data。
void imageupload()
{
CURL *curl;
CURLcode res;
// 初始化 curl 会话
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl)
{
// 设置 URL
char url[256];
snprintf(url, sizeof(url), "%s/api/park/imageupload", serverData.fl_dataserver_domain);
curl_easy_setopt(curl, CURLOPT_URL, url);
// 构建 form-data
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
// 添加普通文本字段
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "app_id",
CURLFORM_COPYCONTENTS, serverData.fl_appid,
CURLFORM_END);
// 添加加密后的 JSON 数据
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "data",
CURLFORM_COPYCONTENTS, encData,
CURLFORM_END);
// 添加二进制图片文件
curl_formadd(&formpost, &lastptr,
CURLFORM_COPYNAME, "image",
CURLFORM_FILE, "pic.jpg",
CURLFORM_CONTENTTYPE, "image/jpeg",
CURLFORM_END);
// 设置 form-data
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
// 设置回调函数,用于打印响应数据
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);
// 执行请求
res = curl_easy_perform(curl);
// 检查错误
if(res != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
// 获取详细的错误信息
long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
fprintf(stderr, "HTTP response code: %ld\n", http_code);
char *error_buffer = NULL;
curl_easy_getinfo(curl, CURLINFO_ERROR, &error_buffer);
if (error_buffer) {
fprintf(stderr, "Error buffer: %s\n", error_buffer);
}
}
// 清理 form-data
curl_formfree(formpost);
// 清理 curl 会话
curl_easy_cleanup(curl);
}
// 清理全局 curl 初始化
curl_global_cleanup();
}
// 回调函数,用于打印数据
size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t total_size = size * nmemb;
printf("%.*s", (int)total_size, (char*)contents);
return total_size;
}