libcurl的文件下载实现

实现文件的下载需要文件的下载链接:

https://xxxx.com/xxx.rar

第一步:初始化libcurl

CURL* curl = curl_easy_init();

第二步:设置下载链接:(ps:string url)

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

 第三步:设置重定向次数,会否验证证书,是否验证主机名称

// 显示重定向次数
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
// 是否验证证书
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
// 是否验证主机名
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

第四步:创建并设置输出文件句柄

FILE* file = NULL;
fopen_s(&file,name.c_str(), "wb");
if (!file)
{
	cout << "文件创建失败!" << endl;
}

设置文件句柄

// 设置数据回调的句柄
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);

第五步:设置下载输出回调

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);

输出回调函数定义:

size_t write_callback(void* ptr, size_t size, size_t nmemb, void* stream)
{
	FILE* fp = (FILE*)stream;
	size_t written = fwrite(ptr, size, nmemb, fp);
	return written;
}

 第六步:如果想在文件下载的时候,同时获取实时的下载进度,就需要开启下载进度回调,并设置回调函数

// 设置文件下载进度回调
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
// 设置进度回调函数
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION,progress_callback);

下载进度回调函数:

 

int progress_callback(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
	if ( dltotal > 0)
	{
		int nPersent = (int)(100.0 * dlnow / dltotal);
		printf("[%f/%f]下载进度:%s\r", dlnow, dltotal,);
	}
	return 0;
}

第七步: 开始执行url

// 开始执行请求
CURLcode res = curl_easy_perform(curl);
// 判断错误
if (res != CURLE_OK)
{
	cout << "下载失败:" << curl_easy_strerror(res) << endl;
}

第八步: 下载完成或者失败的时候,都需要回调curl资源和关闭文件句柄

fclose(file);
curl_easy_cleanup(curl);

小知识:

        (1)libcurl访问https的连接,需要SSL验证,而SSL验证需要再libcurl库编译阶段,添加openssl 支持;所以,为了方便可以直接使用vcpkg去一键编译出代openssl支持的libcurl,下面是命令行语句:

vcpkg install curl[openssl]:x86-windows

        (2)命令行一直在一行打印怎么实现呢,需要用到‘\r’,这个的作用是跳转到当前行的开始; 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libcurl 是一个非常强大的开源网络库,它提供了在各种操作系统上进行文件下载的功能。使用 libcurl 可以实现简单且有效的文件下载。下面是一个使用 libcurl 下载文件的示例: 1. 引入 libcurl文件: ```c #include <curl/curl.h> ``` 2. 定义回调函数: 这个回调函数会在下载数据时被调用,我们可以在这个函数中处理下载的数据。 ```c size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; FILE *file = (FILE *)userp; if (file != NULL) { fwrite(contents, size, nmemb, file); } return realsize; } ``` 3. 执行下载: 在主函数中,我们可以使用 libcurl 提供的函数进行下载。 ```c int main(void) { CURL *curl; FILE *file; curl = curl_easy_init(); if (curl) { // 设置下载的 URL curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/file.txt"); // 打开文件用于保存下载的数据 file = fopen("file.txt", "wb"); if (file != NULL) { // 设置回调函数 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, file); // 执行下载 curl_easy_perform(curl); // 关闭文件 fclose(file); } // 清理资源 curl_easy_cleanup(curl); } return 0; } ``` 以上是使用 libcurl 下载文件的简单示例,它能够通过指定的 URL 下载文件,并将文件保存在本地。使用 libcurl 还可以设置代理、设置下载进度回调等更多功能,使得文件下载功能更加强大和灵活。通过 libcurl,我们可以轻松地在我们的应用程序中实现文件下载功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值