libcurl上传文件

本文介绍了如何利用C++库libcurl进行文件上传,通过实例展示了如何设置请求头、SSL选项,并提供了一个完整的UploadFileSession类来演示上传过程。适合开发者快速了解FTP文件上传的C++实践。
摘要由CSDN通过智能技术生成

1.libcurl功能简介
https://curl.se/libcurl/
具体使用方法可以看这里的简介:https://www.cnblogs.com/heluan/p/10177475.html
2.上传文件到ftp上
具体见代码:

#include <string>

namespace BaseFun
{
	struct UploadFileSession
	{
		static bool UploadFile(std::string& response, const std::string& file_name, const std::string& url, const string& aut);
	};
}

#include "curl/curl.h"
#include <string>
#include<UploadFileSession.h>

using namespace std;


size_t WriteToString(void *buffer, size_t size, size_t nmemb, void *userp)
{
	(*((std::string*)userp)).append((char*)buffer, size * nmemb);

	return size * nmemb;
}

namespace BaseFun
{
	bool UploadFileSession::UploadFile(std::string& response, const std::string& file_name, const std::string& url, const string& aut)
	{
		CURL*  curl_handle_ = curl_easy_init();

		// 重置参数
		curl_easy_reset(curl_handle_);

		// 设置http请求行
		curl_easy_setopt(curl_handle_, CURLOPT_URL, url.c_str());

		// 设置http头
		struct curl_slist* headers = NULL;
		string authorization = "Authorization: " + aut;
		headers = curl_slist_append(headers, authorization.c_str());
		curl_easy_setopt(curl_handle_, CURLOPT_HTTPHEADER, headers);

		// 设置https选项
		curl_easy_setopt(curl_handle_, CURLOPT_SSL_VERIFYPEER, false);
		curl_easy_setopt(curl_handle_, CURLOPT_SSL_VERIFYHOST, false);

		//设置回调函数
		curl_easy_setopt(curl_handle_, CURLOPT_WRITEFUNCTION, WriteToString);
		curl_easy_setopt(curl_handle_, CURLOPT_WRITEDATA, &response);
		curl_easy_setopt(curl_handle_, CURLOPT_CONNECTTIMEOUT, 6L);
		curl_easy_setopt(curl_handle_, CURLOPT_TIMEOUT, 10L);

		// 设置表单数据
		struct curl_httppost* post = NULL;
		struct curl_httppost* last = NULL;

		curl_formadd(
			&post, &last,
			CURLFORM_COPYNAME, "file",
			CURLFORM_FILE, file_name.c_str(),
			CURLFORM_FILENAME, file_name.c_str(),
			CURLFORM_END);


		curl_easy_setopt(curl_handle_, CURLOPT_HTTPPOST, post);

		int rsp_code = 0;
		CURLcode res = curl_easy_perform(curl_handle_);
		if (res == CURLE_OK)
		{
			curl_easy_getinfo(curl_handle_, CURLINFO_RESPONSE_CODE, &rsp_code);
		}
		else
		{
			LOG_ERROR( "upload failed, errorcode = %d, res = %d, resmessage = %s", rsp_code, res, response.c_str());
		}

		curl_formfree(post);
		curl_slist_free_all(headers);

		return res == CURLE_OK ? true : false;
	}

}

//测试用例
#include <stdio.h>
#include <iostream>
#include <stdarg.h>
#include<UploadFileSession.h>

using namespace std;

char* str_fmt(const char* lpFormat, ...)
{
	static char buff[1024 * 10];

	va_list ap;
	va_start(ap, lpFormat);
	vsprintf(buff, lpFormat, ap);
	va_end(ap);
	return buff;
}


int main(int argc, char *argv[])
{
    std::string ip;
    int port;
    string address = str_fmt("https://%s:%d", ip.c_str(), port);
	string url = address + "/api/v1/upload";
		

	string csr_path = "audiofile/" + k_csr;
    string api_key_; // 验证成功后获取到的,这个认证的key
	string resp;
	if(!BaseFun::UploadFileSession::UploadFile(resp, csr_path, url, api_key_))
	{
		return false;
	}
	return 0;
}
使用libcurl库进行POST方法上传文件的步骤如下: 1. 初始化curl库:`curl_global_init(CURL_GLOBAL_ALL);` 2. 创建curl句柄:`CURL* curl = curl_easy_init();` 3. 设置请求URL:`curl_easy_setopt(curl, CURLOPT_URL, url);` 4. 设置请求方式为POST:`curl_easy_setopt(curl, CURLOPT_POST, 1L);` 5. 设置上传的文件:`curl_easy_setopt(curl, CURLOPT_READDATA, file);` 其中,`file`为你要上传的文件的文件指针。 6. 设置上传的文件大小:`curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, file_size);` 其中,`file_size`为你要上传的文件的大小。 7. 设置上传的文件名:`curl_easy_setopt(curl, CURLOPT_POSTFIELDS, file_name);` 其中,`file_name`为你要上传的文件的文件名。 8. 执行请求:`curl_easy_perform(curl);` 9. 清理curl句柄:`curl_easy_cleanup(curl);` 完整的示例代码如下: ``` #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; FILE *file; const char *url = "http://example.com/upload.php"; const char *file_name = "example.txt"; long file_size; file = fopen(file_name, "rb"); if (!file) { fprintf(stderr, "Failed to open file '%s'\n", file_name); return 1; } fseek(file, 0L, SEEK_END); file_size = ftell(file); rewind(file); curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_POST, 1L); curl_easy_setopt(curl, CURLOPT_READDATA, file); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, file_size); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, file_name); 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); } fclose(file); curl_global_cleanup(); return 0; } ``` 注意,这只是一个简单的示例,实际应用中还需要添加错误处理和其他必要的选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值