实现文件的下载需要文件的下载链接:
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’,这个的作用是跳转到当前行的开始;