curl编程实例——文件下载
#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编程实例——文件下载相关推荐
- python编程实例下载-python网络编程之文件下载实例分析
本文实例讲述了python网络编程之文件下载实现方法.分享给大家供大家参考.具体如下: 真是越看越喜欢python啊,想要了解它提供的http和ftp下载功能,原来是如此的简单. 1.相应模块 ftp ...
- C语言 socket编程实例
C语言 socket编程实例 一. 面向连接的流式套接字 C/S 例子 二. 非阻塞的多人聊天服务器端例子 三. 简单的 IPv6 UDP socket编程 四.使用wireshark抓包分析tcp协 ...
- Python并发编程实例教程
有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库. 一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态 ...
- iOS网络编程-iCloud键值数据存储编程实例
iCloud键值数据存储设计 iCloud键值数据存储编程实例,画面中有两个开关控件,左图是设备1点击"设置iCloud数据"按钮,将控件状态保存到iCloud服务器.右图是设备2 ...
- NIO Socket编程实例
1.阻塞模式实例 NIOUtil类,用来通过SOcket获取BufferedReader和PrintWriter. package IO;import java.io.BufferedReader; ...
- linux c编程项目实例,Linux c编程实例_例子
例一:字符与整型变量的实现 #include int main() { int c1,c2; char c3; c1='a'-'A'; c2='b'-'B'; c3='c'-; printf(&quo ...
- C#中Socket多线程编程实例
C#是微软随着VS.net新推出的一门语言.它作为一门新兴的语言,有着C++的强健,又有着VB等的RAD特性.而且,微软推出C#主要的目的是为了对抗Sun公司的Java.大家都知道Java语言的强大功 ...
- 《突破C#编程实例五十讲》源文件下载(2)
上接<<突破C#编程实例五十讲>源文件下载(1)> 有兴趣的朋友下载看看吧,一共有9个压缩包分3篇文章,下载要注意哦,不然解压要出错哦! 转载于:https://blog.51 ...
- java编程50实例_java编程实例大全及详解谜底(50例).doc
java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...
最新文章
- 孙海汐组专访:去伪存真的过程一定不是一帆风顺的
- java根据文件路径读取文件_java根据路径读取文件
- C语言实现TEA系列加解密算法
- 147_Power BI Report Server demo演示
- web安全day13:简单深透测试流程
- TypeScript:数组
- pymysql.err.OperationalError: 1136, Column count doesn t match value count at row 1
- 引入网易云音乐播放器卡片
- SQL Server 数据库增删改查语句
- 【新书推荐】【2019】电磁理论和等离子体电子学的工程师手册
- 热搜大事记【2018-11-05-2018-11-11】
- JAVA-微信网页授权
- C#射击类小游戏简单思路及代码
- 双重检查锁单例模式为什么要用volatile关键字?
- Mega使用及R语言中多序列比对
- pandas数据分析美国各区人口普查案例
- 201612-3-炉石传说
- linux下查询主机名和主机ID
- 平面设计、室内设计、机械设计、网页编程、影视动画等教程网站
- 常用github插件
热门文章
- 少儿零基础编程 设计制作游戏 动画全搞定视频教程
- 苹果处理器排行_苹果M1芯片跑分现身Geekbench平台,频率惊人_电脑办公
- Vue:单页面应用动态设置title
- STM32的GPIO的七个寄存器的配置说明
- 一文看懂虚拟机中Java对象的生死判别
- cad流程图怎么画文丘里_在cad中流程图怎么画
- 李白、高适、杜甫,情义深深,抵不过乱世游离
- 王者荣耀5月一日服务器维护,王者荣耀5月25日更新内容 王者荣耀2021年5月25日全服不停机更新公告...
- java语言代码大全_Java常用语言汇总
- leaflet-图层