#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

curl编程实例——文件下载相关推荐

  1. python编程实例下载-python网络编程之文件下载实例分析

    本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftp ...

  2. C语言 socket编程实例

    C语言 socket编程实例 一. 面向连接的流式套接字 C/S 例子 二. 非阻塞的多人聊天服务器端例子 三. 简单的 IPv6 UDP socket编程 四.使用wireshark抓包分析tcp协 ...

  3. Python并发编程实例教程

    有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库. 一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态 ...

  4. iOS网络编程-iCloud键值数据存储编程实例

    iCloud键值数据存储设计 iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击"设置iCloud数据"按钮,将控件状态保存到iCloud服务器.右图是设备2 ...

  5. NIO Socket编程实例

    1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO;import java.io.BufferedReader; ...

  6. linux c编程项目实例,Linux c编程实例_例子

    例一:字符与整型变量的实现 #include int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3='c'-; printf(&quo ...

  7. C#中Socket多线程编程实例

    C#是微软随着VS.net新推出的一门语言.它作为一门新兴的语言,有着C++的强健,又有着VB等的RAD特性.而且,微软推出C#主要的目的是为了对抗Sun公司的Java.大家都知道Java语言的强大功 ...

  8. 《突破C#编程实例五十讲》源文件下载(2)

    上接<<突破C#编程实例五十讲>源文件下载(1)> 有兴趣的朋友下载看看吧,一共有9个压缩包分3篇文章,下载要注意哦,不然解压要出错哦! 转载于:https://blog.51 ...

  9. java编程50实例_java编程实例大全及详解谜底(50例).doc

    java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...

最新文章

  1. 孙海汐组专访:去伪存真的过程一定不是一帆风顺的
  2. java根据文件路径读取文件_java根据路径读取文件
  3. C语言实现TEA系列加解密算法
  4. 147_Power BI Report Server demo演示
  5. web安全day13:简单深透测试流程
  6. TypeScript:数组
  7. pymysql.err.OperationalError: 1136, Column count doesn t match value count at row 1
  8. 引入网易云音乐播放器卡片
  9. SQL Server 数据库增删改查语句
  10. 【新书推荐】【2019】电磁理论和等离子体电子学的工程师手册
  11. 热搜大事记【2018-11-05-2018-11-11】
  12. JAVA-微信网页授权
  13. C#射击类小游戏简单思路及代码
  14. 双重检查锁单例模式为什么要用volatile关键字?
  15. Mega使用及R语言中多序列比对
  16. pandas数据分析美国各区人口普查案例
  17. 201612-3-炉石传说
  18. linux下查询主机名和主机ID
  19. 平面设计、室内设计、机械设计、网页编程、影视动画等教程网站
  20. 常用github插件

热门文章

  1. 少儿零基础编程 设计制作游戏 动画全搞定视频教程
  2. 苹果处理器排行_苹果M1芯片跑分现身Geekbench平台,频率惊人_电脑办公
  3. Vue:单页面应用动态设置title
  4. STM32的GPIO的七个寄存器的配置说明
  5. 一文看懂虚拟机中Java对象的生死判别
  6. cad流程图怎么画文丘里_在cad中流程图怎么画
  7. 李白、高适、杜甫,情义深深,抵不过乱世游离
  8. 王者荣耀5月一日服务器维护,王者荣耀5月25日更新内容 王者荣耀2021年5月25日全服不停机更新公告...
  9. java语言代码大全_Java常用语言汇总
  10. leaflet-图层