#include <curl/curl.h>
#include <iostream>
#include <string>
using namespace std;
//定义一个结构为了传递给_down_write函数
struct FtpFile
{
const char* fileName;
FILE* stream;
size_t fileSize;
};
size_t _down_write ( void *buffer, size_t size, size_t nmemb, void *stream )
{
struct FtpFile* out = (struct FtpFile*)stream; // stream指针其实就是指向struct FtpFile的
if ( out && !out->stream )
{
out->stream = fopen ( out->fileName, "wb" ); //没有这个流的话就创建一个 名字是out->fileName.
if ( !out->stream ) return -1;
}
size_t fileSize = fwrite ( buffer, size, nmemb, out->stream );
out->fileSize += fileSize;
cout << "_down_write *** [" << size << "][" << nmemb << "][" << out->fileSize << "]\n";
return fileSize;
}
int main()
{
//curl_global_init用来初始化libcurl要用到的一系列的全局常量
CURLcode code = curl_global_init ( CURL_GLOBAL_ALL );
if ( code != CURLE_OK )
{
cout << "test *** curl_global_init 调用失败 [" << code << "]\n";
return -1;
}
//curl_easy_init用来返回CRUL easy句柄;后续其他函数调用都要用到这个句柄
CURL* curl = curl_easy_init();
if ( NULL == curl )
{
cout << "test *** curl_easy_init 失败\n";
return -1;
}
//curl_easy_setopt用来设置参数或选项
//CURLOPT_TIMEOUT设置函数执行的最长时间,时间单位为s
curl_easy_setopt ( curl, CURLOPT_TIMEOUT, 300 );
//CURLOPT_WRITEFUNCTION设置一个处理接收到的下载数据的回调函数
curl_easy_setopt ( curl, CURLOPT_WRITEFUNCTION, &_down_write );
string fileName = "123456.jpg";
FtpFile ftpFile = { fileName.c_str(), NULL, 0 };
//CURLOPT_WRITEDATA设置存储数据的变量
curl_easy_setopt ( curl, CURLOPT_WRITEDATA, &ftpFile );
//CURLOPT_VERBOSE启用时会汇报所有的信息,默认存放在STDERR
curl_easy_setopt ( curl, CURLOPT_VERBOSE, true );
string fileUrl = "http://c.hiphotos.baidu.com/album/w%3D2048/sign=e110aaab024f78f0800b9df34d090855/29381f30e924b899b3fc4dc76f061d950b7bf608.jpg";
//CURLOPT_URL设置要下载的URL地址
curl_easy_setopt ( curl, CURLOPT_URL, fileUrl.c_str() );
//curl_easy_perform用来执行下载,直到数据传输完成函数才返回
CURLcode return_code = curl_easy_perform ( curl );
if ( return_code != CURLE_OK )
{
cout << "test *** curl_easy_perform 调用失败 [" << return_code << "]\n";
return -1;
}
if ( ftpFile.stream ) fclose ( ftpFile.stream );
//curl_easy_cleanup用来释放curl资源
curl_easy_cleanup ( curl );
//curl_global_cleanup用来释放libcurl用到的一系列资源
curl_global_cleanup();
if ( ftpFile.fileSize > 0 )
{
cout << "test *** 文件下载成功 [" << fileName << "][" << ftpFile.fileSize << "]\n";
return 0;
}
cout << "test *** 文件下载失败 [" << fileName << "][" << fileUrl << "]\n";
return 0;
}
# g++ -o a.out main.cpp -lcurl
# a.out