libcurl8.9.1 文件上传(通过回调函数)

 结构体定义:

#define MAX_ARRAY_SIZE      5*1024*1024


struct SMART_DATA_CACHE
{
    char* buf;
    long dwTotalLen;

    SMART_DATA_CACHE()
    {
        dwTotalLen = 0;
        buf = nullptr;
        while (!buf) {
            try {
                buf = new char[MAX_ARRAY_SIZE];
            }
            catch (...) {}
        }
        memset(buf, 0x00, MAX_ARRAY_SIZE);
    }
    ~SMART_DATA_CACHE()
    {
        if (buf) {
            delete[] buf;
            buf = nullptr;
            dwTotalLen = 0;
        }
    }
};

定义读取文件回调函数:

size_t http_read_cb(void* ptr, size_t size, size_t nmemb, void* stream)
{
	FILE* pFile = (FILE*)stream;
	if (pFile) {
		int nRead = fread(ptr, size, nmemb, pFile);
		return nRead;
	}
	return 0;
}

 定义接收服务器返回数据的接收回调函数:

size_t http_recv_cb(void* ptr, size_t size, size_t nmemb, void* stream)
{
	SMART_DATA_CACHE* pDataBuf = (SMART_DATA_CACHE*)stream;
	if (pDataBuf) {
		if (pDataBuf->buf) {
			if (pDataBuf->dwTotalLen + size * nmemb < MAX_ARRAY_SIZE) {
				memcpy(pDataBuf->buf + pDataBuf->dwTotalLen, ptr, size * nmemb);
				pDataBuf->dwTotalLen += size * nmemb;
			}
		}
	}

	return size * nmemb;
}

调用:

memset(stRecv.buf, 0, MAX_ARRAY_SIZE);
stRecv.dwTotalLen = 0;

//
FILE* pFile = _wfopen(pFileName, L"rb+");
if (pFile) {
	struct __stat64  stFileInfo;
	_wstat64(pFileName, &stFileInfo);

	CURL* curl = curl_easy_init();
	if (curl) {
		struct curl_slist* http_header = NULL;
		//http_header = curl_slist_append(http_header, "Expect:");
		//http_header = curl_slist_append(http_header, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3");
		http_header = curl_slist_append(http_header, "Charset: UTF-8");
		http_header = curl_slist_append(http_header, "Connection: keep-alive");//保持长连接
		http_header = curl_slist_append(http_header, "Content-Type: form-data");//保持长连接

		struct curl_httppost* post = NULL;
		struct curl_httppost* last = NULL;
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, http_header);//修改协议头
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http_recv_cb);//设置接收回调
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&stRecv);//设置设置参数
		curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);//设置连接时的超时时间为5秒
		curl_easy_setopt(curl, CURLOPT_TIMEOUT, nTimeout);//超时秒为单位
		curl_easy_setopt(curl, CURLOPT_URL, pUrl);//指定URL
		//curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
		curl_easy_setopt(curl, CURLOPT_READFUNCTION, http_read_cb);//读取文件回调
		curl_easy_setopt(curl, CURLOPT_READDATA, pFile);//文件指针
		curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);//这个必须要
		curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)stFileInfo.st_size);//文件大小
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
		curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
		curl_easy_setopt(curl, CURLOPT_POST, 1L);//这里要看提交方式,可能不需要
		CURLcode res = curl_easy_perform(curl);//执行

		long nRet = 0;
		CURLcode codeRet = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &nRet);
		if (codeRet == CURLE_OK && nRet == 200) {
			bResult = true;
		}

		curl_easy_cleanup(curl);
		curl_formfree(post);
		curl_slist_free_all(http_header);
	}

	fclose(pFile);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值