#pragma once

#include <stdio.h>
#include <stdlib.h>

#include <curl/curl.h>

#ifdef    _DEBUG
#pragma comment(lib, "libcurld_imp.lib")
#else
#pragma comment(lib, "libcurl_imp.lib")
#endif

class CUrlInit
{
public:
    CUrlInit()
    {
        curl_global_init(CURL_GLOBAL_ALL);
    }
    
    ~CUrlInit()
    {
        curl_global_cleanup();
    }
    
protected:
    static CUrlInit m_Initialize;
};

CUrlInit CUrlInit::m_Initialize;

class CMyUrl
{
public:
    CMyUrl()
    {
        /* init the curl session */
        curl_handle = curl_easy_init();
    }

~CMyUrl()
    {
        /* cleanup curl stuff */
        curl_easy_cleanup(curl_handle);
    }

public:
    int get_file(const char* szUrl, const char* szFile)
    {
        curl_easy_reset(m_curl);
        
        /* set URL to get */
        curl_easy_setopt(curl_handle, CURLOPT_URL, szUrl);
        
        /* no progress meter please */
        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 files */         
        FILE* bodyfile = fopen(szFile, "wb");
        if (bodyfile == NULL) {
            curl_easy_cleanup(curl_handle);
            return -1;
        }
        
        /* we want the body be written to this file handle instead of stdout */
        curl_easy_setopt(curl_handle,   CURLOPT_WRITEDATA, bodyfile);
        
        /* get it! */
        curl_easy_perform(curl_handle);        
        
        /* close the body file */
        fclose(bodyfile);

return 0;
    }

protected:
    static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
    {
        int written = fwrite(ptr, size, nmemb, (FILE *)stream);
        return written;
    }

protected:
    CURL *curl_handle;
};

c/c++常用代码--使用libcurl下载文件的更多相关文章

  1. 使用libcurl下载文件小例

    libcurl是一个很强大的开源网络处理库,支持包括HTTP.HTTPS.FTP……一系列网络协议.用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要 ...

  2. libcurl下载文件

    一.初始化 CURL *pHandler = curl_easy_init();   二.设置请求参数: 调用curl_easy_setopt方法,设置选项 curl_easy_setopt(pHan ...

  3. [C#常用代码]如何把指定文件夹中的文件移动到指定的文件夹

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. libcurl下载文件简易demo

    size_t test_save(void *ptr, size_t size, size_t nmemb, void *stream) { size_t sizes = size * nmemb; ...

  5. js发送post请求下载文件

    大家都知道ajax是不能直接下载文件的,所以一般都是通过一个超链接的形式去下载一个文件 但是当牵扯到需要发送很多数据到服务器上再下载的时候超链接的形式就有些太过勉强了 如下是一个工具方法(依赖jque ...

  6. 浏览器兼容性--IE11以及Edge等下载文件的中文名出现乱码,前后端解决方案

    项目中有用到文件下载功能,之前在处理下载时对IE浏览器下文件下载名进行过处理,测试也没有问题,但是功能上线后,业务反馈IE11文件下载文件名依然乱码.打印User-Agent字符串如下: IE11 U ...

  7. [转] 使用 JavaScript 创建并下载文件

    [From] https://gaohaoyang.github.io/2016/11/22/js-create-file-and-download/ 本文将介绍如何使用 JavaScript 创建文 ...

  8. 两种js下载文件的方法(转)

    function DownURL(strRemoteURL, strLocalURL){ try{ var xmlHTTP = new ActiveXObject("Microsoft.XM ...

  9. Ext下载文件

    项目中前台用的是Ext JS,要从数据库中查询数据并导出为Excel表格 对此研究了下,代码如下: 前台代码: /** * 进行下载文件(form方式) */ _downloadDraft:funct ...

随机推荐

  1. postgresql安装配置

    一,什么是postgresql PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES 版本 4.2 为基础的对象关系型数据库管理系统(ORDBMS),简称pgsql,它支持大部分 ...

  2. python3.5在print和input上的几个变化

    1. 在python3.5中使用print,打印内容必须用括号()括起来.python2.7中可以不用括号,如果你加了括号,代码在python2.7中也是可以正常运行的. python3.5 exam ...

  3. VS2010 C++ 操作Excel表格的编程实现

    转载请注明原文网址: http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html 通过VC实现对Excel表格的操作的方法有多种, ...

  4. oracle线程数更改

    查看Oracle最大进程数: SQL> select count(*) from v$session #连接数,查看更多oracle数据库的疑问, 可点击cuug官网.http://www.cu ...

  5. Sqlserver替换函数Replace

    Sqlserver中Replace函数:实现字段中某个字符串批量替换. 注意:强烈建议替换前备份数据库以免发生灾难性后果. update article set [Content]=replace([ ...

  6. C++ inline(内联什么时候使用)

    (1)什么是内联函数?内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数?当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们讲到 ...

  7. cpack

    一. 简介 CPack是CMake 2.4.2之后的一个内置工具,主要作用就是生成制定类型的安装包.它可以脱离cmake单独运行. 二. 基本设置 (mandatory) 设置包类型set(CPACK ...

  8. 关于Ajax跨域

    本人因工作需求,编写了一个测试页面,在页面填写完信息之后去向一个站点请求数据,然后返回结果!一开始是直接用Ajax在脚本中去访问,没有大碍(因为目标地址是本机上的一个网站),但是当站点去外部的网站时, ...

  9. Cassandra 计数器counter类型和它的限制

    文档基础 Cassandra 2.* CQL3.1 翻译多数来自这个文档 更新于2015年9月7日,最后有参考资料 作为Cassandra的一种类型之一,Counter类型算是限制最多的一个.Coun ...

  10. php中利用正则去掉中文全角空格

    一开始用$temp = trim($temp, " "); 这种方法,导致trim后的中文字符有乱码 最后 $str = " 广东君孺律师事务所 "; $str ...