利用libcurl使用的curl_mime实现HTTP接口的form-data(表单)数据的上传(POST),包含文件上传

利用libcurl使用的curl_mime实现HTTP接口的form-data(表单)数据的上传(POST)
libcurl已经抛弃了curl_formadd的相关函数调用,不建议使用curl_formadd方式提交表单,需要使用curl_mime相关的api来实现。

https://curl.se/libcurl/c/curl_formadd.html
在这里插入图片描述

网上的例子比较少,我根据实践整理了一个C语言的例子:

int  mime_post_form_data (int argc, char *argv[])
{
	CURL *curl;
	CURLcode res;
	curl_mime *form = NULL;
	curl_mimepart *file_field = NULL;
	curl_mimepart *file_data = NULL;
	curl_mimepart *tid_field = NULL;
	struct curl_slist *list = NULL;
	struct curl_slist *slist = NULL;
	struct curl_slist *f_list = NULL;
	char r_buf[2048];

	curl_global_init(CURL_GLOBAL_ALL);

	curl = curl_easy_init();
	if(curl)
	{
		curl_easy_setopt(curl, CURLOPT_URL, "http://xxx.yyyy.xxx");  //设置http接口地址
		memset(r_buf,0x00,sizeof(r_buf));
		//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //https方式需要加上ssl认证设置
		//curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);//https方式需要加上ssl认证设置
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, req_reply);  //设置回调函数
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&r_buf);   //设置返回数据的接受缓冲区
		curl_easy_setopt(curl, CURLOPT_HEADER, 1);//取返回报文数据时和报文头一起取回。
		
		 //设置headers-------		
    	list = curl_slist_append(list,"xxx:aaa");  //自定义的header值
    	list = curl_slist_append(list,"yyy:bbb");  //自定义的header值
		list = curl_slist_append(list,"Connection: Keep-Alive");
		list = curl_slist_append(list,"Content-Type:multipart/form-data");
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
       
       	/* 创建表单/
		form = curl_mime_init(curl);
		
	  	/* 添加第一条表单数据/
		tid_field = curl_mime_addpart(form);
		curl_mime_name(tid_field,"tid");
		curl_mime_type(tid_field,"text/plain");
		curl_mime_data(tid_field,"添加的文本类型的表单数据,文件上传",CURL_ZERO_TERMINATED);

		/* 添加第二条表单数据,上传文件/
		file_field = curl_mime_addpart(form);

		f_list = curl_slist_append(f_list, "Content-Transfer-Encoding: 8bit");
		f_list = curl_slist_append(f_list, "Content-Range: 0-9962/9963");
		f_list = curl_slist_append(f_list, "Content-Length: 9963");
       
		curl_mime_headers(file_field, f_list, 1);  //设置表单数据的头域
		curl_mime_name(file_field,"File");
		curl_mime_filedata(file_field, "./logo.png");

		curl_easy_setopt(curl, CURLOPT_MIMEPOST, form);

		/*执行POST发送请求*/
		res = curl_easy_perform(curl);
		if(res != CURLE_OK)
		  fprintf(stderr, "curl_easy_perform() failed: %s\n",  curl_easy_strerror(res));


		curl_easy_cleanup(curl);

		curl_mime_free(form);
		printf("收到的buf=\n%s\n",r_buf);
		/* free slist */
		curl_slist_free_all(list);
	}
	return 0;
}

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值