curl使用小记(二)——远程下载一张图片
1. 概述
在之前的文章《curl使用小记(一)》中论述了命令行工具curl的基本使用。除此之外,curl还提供了能够直接供程序调用的模块库接口libcurl。这里就通过一个远程下载网络上的一个图片的实例,讲述libcurl的使用。
2. 实例
libcurl库还是推荐直接找已经编译好的,因为是C程序接口,所以还是比较稳定的。
libcurl虽然用起来比较繁复,但大概可以就初分为4类函数:
- 初始化:curl_easy_init()。
- 配置数据传输选项,设置回调函数:curl_easy_setopt()。
- 启动传输任务:curl_easy_perform()。
- 释放资源:curl_easy_cleanup()。
其中curl_easy_setopt最为繁复,curl有超多的配置选项可以选择,但是基本上可以跟curl命令行工具的参数选项对应起来。具体实例如下,可参看注释说明:
#include <iostream>
#include <curl/curl.h>
using namespace std;
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}
//显示文件传输进度,dltotal代表文件大小,dlnow代表传输已经完成部分
//clientp是CURLOPT_PROGRESSDATA传入的值
int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow){
if (dltotal != 0)
{
printf("%lf / %lf (%lf %%)\n", dlnow, dltotal, dlnow*100.0 / dltotal);
}
return 0;
}
int main()
{
const char *netlink = "http://cn.bing.com/th?id=OHR.GrandsCausses_EN-CN3335882379_800x480.jpg";
const char *output = "dst.jpg";
curl_global_init(CURL_GLOBAL_ALL); //初始化全局资源
CURL *curl = curl_easy_init(); //初始化句柄
//需要的话,可以设置代理
curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:1080");
//访问网址
curl_easy_setopt(curl, CURLOPT_URL, netlink);
//设置用户代理
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");
//注意以二进制打开
FILE *fp = nullptr;
if (fopen_s(&fp, output, "wb") != 0)
{
curl_easy_cleanup(curl);
return 0;
}
//写出数据
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
//实现下载进度
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, nullptr);
//运行
curl_easy_perform(curl);
curl_easy_cleanup(curl); //释放句柄
fclose(fp);
curl_global_cleanup(); //释放全局资源
return 1;
}
这个实例访问了网上的一个图片资源,设置了一个代理,并且伪装成浏览器访问,并将其图片下载到本地。最后还实现了下载进度的显示:

需要注意的是我试过很多图片资源,并不是所有的图片资源都能够正常访问到并且下载的。这里面的原因是一方面网站服务器就做了相关的设置,比如博客网站上的图片资源就不允许外链,我这里下载博客网站上的图片就失败了;另一方面是curl的配置项并没有做好完善的配置,服务器不会接受一些不合规的配置请求访问,毕竟请求都是消耗资源的,现在的正规网站都会做一些反爬虫的设置。
3. 参考
curl使用小记(二)——远程下载一张图片的更多相关文章
- PHP CURL实现远程下载文件到本地
<?php //$result=httpcopy('http://www.phpernote.com/image/logo.gif'); echo '<pre>';print_r($ ...
- PHP实现远程下载文件到本地
PHP实现远程下载文件到本地 投稿:hebedich 字体:[增加 减小] 类型:转载 经常写采集器发布接口需要使用到远程附件的功能,所以自己写了一个PHP远程下载文件到本地的函数,一般情况下已经 ...
- Blend4精选案例图解教程(二):找张图片玩特效
原文:Blend4精选案例图解教程(二):找张图片玩特效 Blend中的特效给了我们在处理资源时更多的想象空间,合理地运用特效往往会得到梦幻般效果,本次教程展示对图片应用特效的常规操作,当然特效不仅限 ...
- 台达PLC实现远程下载程序
台达PLC实现远程下载程序 日期:2019-04-27 时间 08:33:57 让物联变得更简单 18-09-2411:25 明明在公司调试没问题的设备一到 ...
- 树莓派2B安装Xware迅雷远程下载
转自:http://www.cnblogs.com/liangjh/articles/5347811.html 一.安装使用迅雷Xware (1)下载Xware1.0.31_armel_v5te_gl ...
- 树莓派2安装Xware实现迅雷远程下载
首先,远程功能很实用,尤其是基于迅雷的,现在国内的下载基本上迅雷只手遮天,别的工具友好程度不理想,这是对于我这种小白来说. 首先,我的树莓派系统不是原生的,我烧写的是ubuntu16,没有桌面,没有多 ...
- php使用curl简单抓取远程url的方法
这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php使用curl抓取远程url的方法.分 ...
- LINUX安装SVN+添加自动同步+远程下载最新代码
LINUX安装SVN+添加自动同步+远程下载最新代码---------------------1. 新建一个用户:svnroot ,以下操作非特别说明皆为root用户操作--------------- ...
- Python 模块功能paramiko SSH 远程执行及远程下载
模块 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现 ...
- Python下载一张图片与有道词典
1.下载一张图片代码1 import urllib.request response = urllib.request.urlopen('http://photocdn.sohu.com/201009 ...
随机推荐
- osx12.6设置全屏
首先安装VMWARE TOOLS就是unlocker208下的tool的darwin.iso 然后进入终端命令,这里要说一下,好多资料说按COMMAND键,反正我是没有进去,直接在vmware菜单里选 ...
- sqlserver在设计表结构时,如何选择字段的数据类型
在设计表结构时,选择适当的字段数据类型是非常重要的,它会直接影响数据库的性能.存储空间和数据的完整性.以下是在 SQL Server 中选择字段数据类型时的一些建议和理由: 1. 整数类型:在 SQL ...
- js闭包使用之处
1.循环绑定 No Use: var lists = document.getElementsByTagName('li'); for(var i=0;i<lists.length;i& ...
- vscode/sublime 语法高亮定义和代码段的区别
vscode插件数据格式基于json,sublime插件数据格式基于xml.sublime插件的官方文档说的不清楚,相关教程也很难找,遇到的一些坑记录一下 语法定义文件对比 同样使用TextMate定 ...
- MySQL查看数据库性能常用命令和实战教学
MySQL查看数据库性能常用命令 # 列出MySQL服务器运行各种状态值 show global status; # 查询MySQL服务器配置信息语句 show variables; # 慢查询 sh ...
- 记录一次金仓V8R3数据库坏块处理过程、PostgreSQL数据库适用
因数广政务云华为业务存储固件升级,导致数据库产生坏块,业务SQL查询报错如下: ERROR: missing chunk number 0 for toast value 38166585 in SY ...
- .NET周刊【11月第1期 2023-11-09】
国内文章 C#/.NET/.NET Core优秀项目和框架2023年10月简报 https://www.cnblogs.com/Can-daydayup/p/17804085.html 本文主要介绍了 ...
- AB32VG1系列之手把手入门与RTC简单评测
说是评测, 时间仓库仅仅是玩了一下例程而已. 后面有时间打算移植 CoreMark 看看与Cortex-M3的对比. AB32VG1系列之手把手入门与RTC简单评测
- RLHF · PBRL | RUNE:鼓励 agent 探索 reward model 更不确定的 (s,a)
论文题目: Reward uncertainty for exploration in preference-based reinforcement learning,是 ICLR 2022 的文章, ...
- 题解 CF1739B
题目大意: 有一个非负整数序列 \(A\),定义序列 \(D\) 是序列 \(A\) 的绝对值差分序列,问给定序列 \(D\),能否求出唯一的序列 \(A\),若不能,输出 \(-1\),否则输出序列 ...