通过curl实现的跨平台http上传和下载接口

该代码示例展示了如何使用C++与libcurl库实现HTTP文件上传和下载功能。`HttpUpload`函数处理文件上传,而`HttpGet`函数用于下载。它们都利用`curl_easy_perform`执行请求,并通过`receive_data`回调函数处理响应数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我使用的是curl-7.84.0.zip,编译过程不再多说

http接口代码是跨平台的

#include "curl/curl.h"

size_t receive_data(void* buffer, size_t size, size_t nmemb, void* lpVoid)
	{
		std::string* str = dynamic_cast<std::string*>((std::string*)lpVoid);
		if (NULL == str || NULL == buffer)
		{
			return -1;
		}


		char* pData = (char*)buffer;
		str->append(pData, size * nmemb);
		return nmemb;
	}

	bool HttpUpload(const std::string& strUrl, const std::string& localFile, const std::string& remoteFile, const long nTimeout)
	{
		curl_global_init(CURL_GLOBAL_DEFAULT);
		CURL* curl = curl_easy_init();
		CURLcode res;
		std::string strData;

		struct curl_httppost* post = NULL;
		struct curl_httppost* last = NULL;
		if (curl)
		{		

			curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
			curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
			curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_data);
			curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strData);
			curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
			curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);
			curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeout);
			curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
			curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

			curl_formadd(&post, &last, CURLFORM_PTRNAME, "file", CURLFORM_FILE, localFile.c_str(), CURLFORM_FILENAME, remoteFile.c_str(), CURLFORM_END);
			curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);  

			res = curl_easy_perform(curl);

			if (res != CURLE_OK)
			{
				return false;
			}

			curl_easy_cleanup(curl);
			curl_global_cleanup();
		}
		else
		{
			return false;
		}
		return true;
	}

	bool HttpGet(const std::string& strUrl, std::string& strData, const long nTimeout)
	{
		curl_global_init(CURL_GLOBAL_DEFAULT);
		CURL* curl = curl_easy_init();
		CURLcode res;

		if (curl)
		{
			curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
			curl_easy_setopt(curl, CURLOPT_READFUNCTION, NULL);
			curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_data);
			curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&strData);
			curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
			curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 6);
			curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeout);
			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)
			{
				return false;
			}

			if (strData.compare("error") == 0)
			{
				return false;
			}

			curl_easy_cleanup(curl);
			curl_global_cleanup();
		}
		else
		{
			return false;
		}
		return true;
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值