curl使用小記(二)——遠程下載一張圖片

1. 概述

在以前的文章《curl使用小記(一)》中論述了命令行工具curl的基本使用。除此以外,curl還提供了可以直接供程序調用的模塊庫接口libcurl。這裏就經過一個遠程下載網絡上的一個圖片的實例,講述libcurl的使用。html

2. 實例

libcurl庫仍是推薦直接找已經編譯好的,由於是C程序接口,因此仍是比較穩定的。ios

libcurl雖然用起來比較繁複,但大概能夠就初分爲4類函數:編程

  1. 初始化:curl_easy_init()。
  2. 配置數據傳輸選項,設置回調函數:curl_easy_setopt()。
  3. 啓動傳輸任務:curl_easy_perform()。
  4. 釋放資源: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;
}

這個實例訪問了網上的一個圖片資源,設置了一個代理,而且假裝成瀏覽器訪問,並將其圖片下載到本地。最後還實現了下載進度的顯示:
imglink1服務器

須要注意的是我試過不少圖片資源,並非全部的圖片資源都可以正常訪問到而且下載的。這裏面的緣由是一方面網站服務器就作了相關的設置,好比博客網站上的圖片資源就不容許外鏈,我這裏下載博客網站上的圖片就失敗了;另外一方面是curl的配置項並無作好完善的配置,服務器不會接受一些不合規的配置請求訪問,畢竟請求都是消耗資源的,如今的正規網站都會作一些反爬蟲的設置。網絡

3. 參考

  1. libcurl 接口調用方式
  2. C++ 用libcurl庫進行http通信網絡編程
相關文章
相關標籤/搜索