C++基于libcurl 的文件下载

首先基于环境的配置这里不做详细描述,请务必保证依赖所需的库文件加载进去

通过libcurl下载文件,方法实现如下:

#include <stdio.h>
#include <curl/curl.h>
#include "DownloadInfo.h"

/************************************************************************/
/*    create by: mengxiaoxin   date:2014/12/9                           */
/************************************************************************/

/*  libcurl write callback function */
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
	size_t written = fwrite(ptr, size, nmemb, stream);
	return written;
}

/*
			   Function:   libcurl connection initialization  download  file
			 Parameters:   (const char* url, const char outfilename[FILENAME_MAX])
			        url:   要下载文件的url地址
		    outfilename:   下载文件指定的文件名
*/
int DOWNLOAD_FILE(const char* url, const char outfilename[FILENAME_MAX]){
	CURL *curl;
	FILE *fp;
	CURLcode res;
	/*   调用curl_global_init()初始化libcurl  */
	res = curl_global_init(CURL_GLOBAL_ALL);
	if (CURLE_OK != res)
	{
		printf("init libcurl failed.");
		curl_global_cleanup();
		return -1;
	}
	/*  调用curl_easy_init()函数得到 easy interface型指针  */
	curl = curl_easy_init();
	if (curl) {

		fopen_s(&fp,outfilename,"wb"); 

		/*  调用curl_easy_setopt()设置传输选项 */
		res = curl_easy_setopt(curl, CURLOPT_URL, url);
		if (res != CURLE_OK)
		{
			fclose(fp);
			curl_easy_cleanup(curl);
			return -1;
		}
	    /*  根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务  */
		res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
		if (res != CURLE_OK)
		{
			fclose(fp);
			curl_easy_cleanup(curl);
			return -1;
		}
		/*  根据curl_easy_setopt()设置的传输选项,实现回调函数以完成用户特定任务  */
		res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
		if (res != CURLE_OK)
		{
			fclose(fp);
			curl_easy_cleanup(curl);
			return -1;
		}

		res = curl_easy_perform(curl);                               // 调用curl_easy_perform()函数完成传输任务
		fclose(fp);
		/* Check for errors */
		if(res != CURLE_OK){
			fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
			curl_easy_cleanup(curl);
			return -1;
		}

		/* always cleanup */
		curl_easy_cleanup(curl);                                     // 调用curl_easy_cleanup()释放内存 

	}
	curl_global_cleanup();
	return 0;
}

以上代码是基于官方修改而成

官方的例子程序如下:

/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2012, Daniel Stenberg, <[email protected]>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <curl/curl.h>

static 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;
}

int main(int argc, char *argv[])
{
  CURL *curl_handle;
  static const char *pagefilename = "page.out";
  FILE *pagefile;

  if(argc < 2 ) {
    printf("Usage: %s <URL>\n", argv[0]);
    return 1;
  }

  curl_global_init(CURL_GLOBAL_ALL);

  /* init the curl session */
  curl_handle = curl_easy_init();

  /* set URL to get here */
  curl_easy_setopt(curl_handle, CURLOPT_URL, argv[1]);

  /* Switch on full protocol/debug output while testing */
  curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);

  /* disable progress meter, set to 0L to enable and disable debug output */
  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);

  /* send all data to this function  */
  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);

  /* open the file */
  pagefile = fopen(pagefilename, "wb");
  if (pagefile) {

    /* write the page body to this file handle */
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, pagefile);

    /* get it! */
    curl_easy_perform(curl_handle);

    /* close the header file */
    fclose(pagefile);
  }

  /* cleanup curl stuff */
  curl_easy_cleanup(curl_handle);

  return 0;
}
时间: 2024-10-29 10:48:34

C++基于libcurl 的文件下载的相关文章

基于SpringMVC的文件下载实例

文件的下载和文件的上传一样都是Web应用中一个重要的功能点.这篇"SpingMVC的文件下载"是基于以前写过的那篇"SpringMVC实现文件上传"写的,因此这里就不从头开始搭建测试项目了,直接接着上次的那个项目来进行测试,因此看这篇文章之前需要简单浏览下上次的那篇文章 注:SpringMVC实现文件上传:http://www.zifangsky.cn/406.html (1)在UploadController.java这个controller里的upload方法中

基于libcurl的GET与POST(HTTP1.1)

#include <stdio.h> #include <curl/curl.h> bool getUrl(char *filename) { CURL *curl; CURLcode res; FILE *fp; if ((fp = fopen(filename, "w")) == NULL) // 返回结果用文件存储 return false; struct curl_slist *headers = NULL; // headers = curl_slis

基于libcurl的POST(http)

#include <stdio.h> #include <curl/curl.h> int main (void) { char *url="http://www.nengyouyun.cn/user/getAppversionnew2?apptype=H5C899DDC"; //char *url="http://127.0.0.1:8080"; //Liuzhenbo //char *url="http://www.baidu.

C++ 用libcurl库进行http通讯网络编程

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用的HTTP消息头六.获取http应答头信息 七.多线程问题 八.什么时候libcurl无法正常工作 九.关于密码 十.HTTP验证 十一.代码示例 1.基本的ht

2.1 LibCurl编程流程(转)

转载地址:http://blog.chinaunix.net/u/17660/showart_1822514.html2 LibCurl编程2.1 LibCurl编程流程在基于LibCurl的程序里,主要采用callback function (回 调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能.下面是利用libcurl完成传输任务的流程:1. 调用curl_global_init()初始化libcurl2. 调用

LibCurl编程流程

在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能.下面是利用libcurl完成传输任务的流程: 1.       调用curl_global_init()初始化libcurl 2.       调用 curl_easy_init()函数得到 easy interface型指针 3.       调用curl_easy_setopt设置传输选

C++ 用libcurl库进行http通讯网络编程 【转】

http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_perform 函数说明(error 状态码) 五.libcurl使用的HTTP消息头六.获取http应答头信息 七.多线程问题 八.什么时候libcurl无法正常工作 九.关于密

LibCurl编程手册以及代码实例

1. LibCurl编程流程 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能.下面是利用libcurl完成传输任务的流程: 1.       调用curl_global_init()初始化libcurl 2.       调用 curl_easy_init()函数得到 easy interface型指针 3.       调用curl_e

基于ibcurl的跨平台多线程断点续传下载库

之前写过一个多线程断点续传的下载库,不过那个是基于一个linux的下载程序.windows下运行还好,android下就各种问题,调试起来还麻烦.后面开发游戏的时候,一方面对下载要求不高,另一方面也精力有限,所以就没有继续研究. 趁现在有时间,我希望实现一个自己满意的下载库,满足以下需求: 1.多线程下载,根据文件大小和下载的文件数目进行调度.一般情况下是一个文件一个文件按照顺序下载,如果文件比较多的情况下可以多个文件同时下载,这个是可以设置的. 2.断点续传.下载进度记录到一个配置文件中,要求