libcurl post/get上传下载文件 以及断点下载(操作libcurl 实现断点下载(续点续传))

分享个C++封装Libcurl代码(支持下载文件、GET\POST、重定向断点续传等功能) 前言 前面分享过一个Windows上封装Winhttp和WinInet API的代码,结果下载页好评特别多(呵呵),谢谢大家赏脸。文章地址:开源一个C++实现的简单HTTP协议处理库,里面有代码资源下载地址。但是,在实际开发过程中我发现WinHttp API严重依赖微软的IE组件,下载过程中会出现些很少见的异常。(比如下载文件和使用chrome浏览器下载的文件不一样。。。。)因此,有必要替 阅读详情


各位亲 有时间可以去看看我的  “金骏家居淘宝店” http://jinjun1688.taobao.com/shop/view_shop.htm?tracelog=twddp 买时说明在我的博客看到有优惠哦 还有意外礼品赠送  真正的程序员淘宝店

头文件

//

//  XXSimpleNetManager.h

//  XXLib

//


#ifndef __XXLib__XXSimpleNetManager__

#define __XXLib__XXSimpleNetManager__


#include <iostream>


class XXSimpleNetManager {

  

    

   /*

     ------------基于libcurl 的静态方法--------

     */

public:

   /*

     * @Description: 基于libcurl的同步 http get方法

     * @prama[aUrl]: get请求的url

     * @prama[&aResponseData]: get得到的数据返回

     * @return: 操作结果 @see CURLcode

     */

   staticint SimpleSyncGet(conststd::string& aUrl,std::string &aResponseData);

    

   /*

     * @Description: 基于libcurl的同步 http post方法

     * @prama[aUrl]: post请求的url

     * @prama[aPostData]:post给服务器的数据

     * @prama[&aResponseData]: post请求到的数据

     * @return: 操作结果 @see CURLcode

     */

   staticint SimpleSyncPost(conststd::string& aUrl,conststd::string& aPostData,std::string &aResponseData);

    

   /*

     * @Description: 基于libcurl的同步下载文件方法

     * @prama[aUrl]: 要下载的文件的请求url

     * @prama[fp]: 本地要写入的文件的句柄

     * @prama[aPosition]: 下载请求的文件起始位置(本地不完整文件的大小,默认为0表示从头下载)

     * @return: 操作结果 @see CURLcode

     */

   staticint SimpleSyncDownload(conststd::string& aUrl,FILE* fp,constlong& aPosition );

    

   /*

     * @Description: 基于libcurl的同步下载文件方法

     * @prama[aUrl]: 要下载的文件的请求url

     * @prama[aFileName]: 本地要写入的文件的名字

     * @prama[aPosition]: 下载请求的文件起始位置(本地不完整文件的大小,默认为0表示从头下载)

     * @return: 操作结果 @see CURLcode

     */

   staticint SimpleSyncDownloadToFile(conststd::string& aUrl,conststd::string& aFileName,constlong& aPosition  );

    

   

    

};


#endif /* defined(__XXLib__XXSimpleNetManager__) */




实现文件

//

//  XXSimpleNetManager.cpp

//  XXLib

//



#include "XXSimpleNetManager.h"

#import "curl.h"


#define VAN_CURL_DEBUG  0


#define VAN_CONNECT_TIMEOUT   5

#define VAN_POST_TIMEOUT    10

#define HTTP_RESPONSE_OK    200


//长途下载文件大小

double downloadFileLenth = 0;

//当地文件大小

double localFileLenth = 0;


staticsize_t OnWriteData(void* buffer,size_t size, size_t nmemb,void* lpVoid)

{

   std::string* str =dynamic_cast<std::string*>((std::string *)lpVoid);

   if(NULL == str ||NULL == buffer )

    {

       return -1;

    }

    

   char* pData = (char*)buffer;

    str->append(pData, size * nmemb);

   return nmemb;

}


staticsize_t OnDownLoadFile(void* buffer,size_t size, size_t nmemb,void* fp)

{

   fwrite(buffer, size, nmemb, (FILE*)fp);

   fflush((FILE*)fp);

    

   return nmemb;

}




//基于libcurl的同步 http get方法


 intXXSimpleNetManager::SimpleSyncGet(conststd::string& aUrl,std::string &aResponseData)

{

    CURL *curl = curl_easy_init();

   CURLcode res;

   if (!curl) {

        returnCURLE_FAILED_INIT;

    }

    

   curl_easy_setopt(curl,CURLOPT_URL, aUrl.c_str());

  

    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,OnWriteData);

    curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *)&aResponseData);

    

    

    res =curl_easy_perform(curl);

    curl_easy_cleanup(curl);

    

   return res;


    

}


//基于libcurl的同步 http post方法

intXXSimpleNetManager::SimpleSyncPost(conststd::string& aUrl,const std::string& aPostData,std::string &aResponseData)

{

    CURL *curl = curl_easy_init();

   CURLcode res;

   if (!curl) {

        returnCURLE_FAILED_INIT;

    }

        

   std::string jsonResponse;

    

    curl_easy_setopt(curl,CURLOPT_URL, aUrl.c_str()); //这个 URL 是一个以 '\0' 结尾的字符串或参数指针  这个选项是唯一一个必须在 curl_easy_perform()调用之前就要设置的选项。

    curl_easy_setopt(curl,CURLOPT_POSTFIELDS, aPostData.c_str());//传递一个作为HTTP “POST”操作的所有数据的字符串

    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,OnWriteData);  //回调函数  用此来保存接收到的数据点大小

    curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *)&aResponseData);//函数会将接收到的数据自动的写到这个 FILE 指针所指向的文件流中

   curl_easy_setopt(curl,CURLOPT_NOSIGNAL, 1);    //curl需要进行毫秒超时使用

    curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT,VAN_CONNECT_TIMEOUT);

    curl_easy_setopt(curl,CURLOPT_TIMEOUT,VAN_POST_TIMEOUT); //设置一个长整形数,作为最大延续多少秒

    

    res =curl_easy_perform(curl);

    curl_easy_cleanup(curl);

    

   return res;

    

    

    

//    CURL *handler=curl_easy_init();    //初始化curl环境,新建curl对象,前往对象句柄

// 

//    if (!handler) {

//        return CURLE_FAILED_INIT;

//    }

//    curl_easy_setopt(handler, CURLOPT_URL, aUrl.c_str()); //设置目的URL地址

//    curl_easy_setopt(handler, CURLOPT_HEADER,1);   //设置是否包含http头

//    curl_easy_setopt(handler, CURLOPT_CONNECTTIMEOUT,30); //设置下载超时30秒则前往xiaz失败

//    curl_easy_setopt(handler, CURLOPT_RESUME_FROM,0);   //设置从0字节处下载

//    // curl_easy_setopt(handler, CURLOPT_RESUME_FROM,"500-900");   设置下载从500字节到900字节

//    curl_easy_setopt(handler, CURLOPT_WRITEFUNCTION, OnWriteData);   //设置回调的进度函数,设置后,会始终的调用进度函数,并传递参数总大小和已下载大小给该函数    

//    

//    

//    CURLcode res=curl_easy_perform(handler);//末尾执行下载操纵,若下载失败会前往错误码

    

    

  

}

//基于libcurl的同步下载文件方法

 intXXSimpleNetManager::SimpleSyncDownload(conststd::string& aUrl,FILE* fp, constlong& aPosition )

{

     

  

    

    CURL *curl = curl_easy_init();

   CURLcode res;

   if (!curl)

    {

        returnCURLE_FAILED_INIT;

    }


   curl_easy_setopt(curl,CURLOPT_URL, aUrl.c_str());//设置目的URL地址

   curl_easy_setopt(curl,CURLOPT_HEADER,1);  //设置是否包含http头

   //curl_easy_setopt(curl, CURLOPT_RANGE, "2-6"); //传递一个你想指定的范围下载指定字节的文件块

    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,OnDownLoadFile);//回调函数  用此来保存接收到的数据点大小

    curl_easy_setopt(curl,CURLOPT_WRITEDATA, fp);//函数会将接收到的数据自动的写到这个 FILE指针所指向的文件流中。

    curl_easy_setopt(curl,CURLOPT_RESUME_FROM,0);  //从0字节开始下载

    curl_easy_setopt(curl,CURLOPT_CONNECTTIMEOUT, 10);  //设置下载超时10秒

    

    res =curl_easy_perform(curl);

    

    curl_easy_cleanup(curl);

   return res;

    

  

    


    

}

//基于libcurl的同步下载文件方法

 intXXSimpleNetManager::SimpleSyncDownloadToFile(conststd::string& aUrl,conststd::string& aFileName,constlong& aPosition )

{

   FILE* fp =fopen(aFileName.c_str(),"rb+");

   

    int res =XXSimpleNetManager::SimpleSyncDownload(aUrl, fp,aPosition);

    

   fclose(fp);

    

   return res;


}


测试文件

//

//  ViewController.m

//  VanSimpleNetMessager

//

//


#import "ViewController.h"

#include "XXSimpleNetManager.h"

#import "curl.h"


using namespace std;


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad

{

    [superviewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

//    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

//    NSLog(@"Get document path:%@",[paths objectAtIndex:0]);

//    NSString *fileName=[[paths objectAtIndex:0]

//                        stringByAppendingPathComponent:@"myFiles11"];

//    NSLog(@"-------");

//    const char* cfilename = [fileName cStringUsingEncoding:NSUTF8StringEncoding];

    

    std::string handler1="http://192.168.1.99/xampp/test/testFile.dmg";

   std::string  data;

    XXSimpleNetManager::SimpleSyncGet(handler1, data);

   NSLog(@"data==%s",data.c_str());

    

    std::string handler2="http://192.168.1.99/Applications/XAMPP/xamppfiles/htdocs/xampp/test1";

    std::string strDATA="hellloodofosofoso";

   std::string ResponseData;

    

   XXSimpleNetManager::SimpleSyncPost(handler2, strDATA, ResponseData);

   NSLog(@"resPonsedats==%s",ResponseData.c_str());

    

    std::string handler3="http://192.168.1.99/xampp/test/testFile.dmg";

    

    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSLog(@"Get document path:%@",[pathsobjectAtIndex:0]);

   NSString *fileName=[[pathsobjectAtIndex:0]

                           stringByAppendingPathComponent:@"myFiles11"];

    constchar* cfilename = [fileNamecStringUsingEncoding:NSUTF8StringEncoding];

   FILE *fptr;

   structcurl_slist *http_head=NULL;

    

   if ((fptr=fopen(cfilename,"wa")) ==NULL) {

        fprintf(stderr,"fopen file error: %s\n",cfilename);

       exit(1);

    }

    

   fseek(fptr, 0L, 2);

   unsignedlong filesize =ftell(fptr);

   NSLog(@"filesize2 == %d", (int)filesize);

   long aPositiondata=filesize ;


   XXSimpleNetManager::SimpleSyncDownload(handler3,fptr,aPositiondata );

    NSLog(@"--------");

    

   fclose(fptr);

   if ((fptr=fopen(cfilename,"rb")) ==NULL) {

        fprintf(stderr,"fopen file error: %s\n",cfilename);

       exit(1);

    }

   char tmp[1024];

   memset(tmp, 0,1024);

   rewind(fptr);

   fread(tmp, 1, 10, fptr);

   NSLog(@"tmp==%s,,%ld",tmp,strlen(tmp));;

   fclose(fptr);

    

    


    

}


- (void)didReceiveMemoryWarning

{

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end




Libcurl网络请求与离线下载实战教程 htmltable {th, td {th {pre {简介:Libcurl是一个用于处理多种网络协议的开源库,特别是在HTTP和HTTPS方面。本教程中,作者提供了一个封装好的Libcurl库,专为离线下载、HTTP请求以及代理设置进行了优化。教程详细介绍了如何使用libcurl进行基本的网络操作,包括发送GET和POST请求、设置请求头、处理代理等。此外,还包含了如何进行离线下载的断点续传,以及如何通过封装的动态链接库简化网络任务的开发过程。 阅读详情

相关推荐

SAP开发实战:用FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本(附完整ABAP代码)

本文详细介绍了如何使用SAP的FI_DOCUMENT_CHANGE BAPI批量修改FB03凭证抬头和行项目文本,提供完整的ABAP代码实现方案。通过该BAPI,开发者可以高效完成财务凭证的批量修改,确保数据一致性和审计合规性,显著提升SAP财务模块的运维效率。

weixin_29224589的博客 381

使用C++的libcurl库实现HTTP的POST请求

libcurl库是由C语言编写的轻量级网络库。可以实现客户端的一些基本功能。本文使用libcurl库实现了HTTP的POST请求。

李文韬的博客 1329

Gemini 2.5 Pro国内免魔法直连教程:5分钟搞定专业级PPT图表(附折线图/柱状图案例)

本文详细介绍了如何利用Gemini 2.5 Pro快速生成专业级PPT图表,包括折线图和柱状图等常见商业图表。通过自然语言交互和智能图表生成功能,用户可以在5分钟内完成数据可视化,大幅提升工作效率。文章还提供了实战案例和高级技巧,帮助用户轻松应对各种商业场景需求。

weixin_30733003的博客 460

libcurl post上传文件

#include &lt;stdio.h&gt;#include &lt;string.h&gt; #include &lt;curl/curl.h&gt; int main(int argc, char *argv[]){  CURL *curl;  CURLcode res;   struct curl_httppost *formpost=NULL;  struct curl_httppos...

weixin_33937778的博客 959

FPGA可重构技术

介绍FPGA 可重构技术的实现方法,包括全局重构和部分重构

航天领域资深码农,型号经验丰富,一线干货分享 1989

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3793

libcurl 实现http post请求和http文件下载(C语言)

libcurl 实现http post请求和http文件下载

qq_42161913的博客 3080

mipi协议中的calibration和scramble模式

在MIPI(Mobile Industry Processor Interface)协议中,calibration(校准)和scramble(加扰)模式是两个重要的特性,它们分别用于优化数据传输的准确性和减少信号干扰。

flomingo1的专栏 2399

实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现

之前我们已经详细介绍了WinHttp接口如何实现Http的相关功能。本文我将主要讲解如何使用libcurl库去实现相关功能。(转载请指明出于breaksoftware的csdn博客) libcurl在http://curl.haxx.se/libcurl/有详细的介绍,有兴趣的朋友可以去读下。本文我只是从实际使用的角度讲解其中的一些功能。 lib...

方亮的专栏 2万+

Vc出现不能连接到一个或多个 vCenter server 系统:http://vcenter-vx.utibet.edu.cn:443/sdk

问题描述: 解决办法: esxi6.7的bug 第一种通过升级系统来解决问题 第二种是通过删除数据来解决 第一步:进入到esxi的shell 第二步查看其中的服务开启状态 第二步 df -h 第三步 /opt/vmware/vpostgres/current/bin/psql -d VCDB -U postgres 第四步 SELECT nspname || '.' || relname AS "relation", pg_size_pretty(pg_total_relation_size(C.oi

m0_49328536的博客 9900

智能车图像处理22-进阶篇14--小s的判断

这篇文章中主要讲述智能车图像处理中 : 小s的判断方法。

taiyuezyh的博客 2566

libcurl http post 二进制流(文件片段上传)

linux C/++ libcurl form-data 表单post 文件二进制片段到后台服务器

zhujinghao09的专栏 1725

4、风险管理、信息安全与信息管理的核心原则

本文深入探讨了风险管理、信息安全与信息管理的核心原则,涵盖Risk IT框架、ISO 31000标准以及信息安全与信息管理的关键原则。通过案例分析与实际应用挑战的解析,帮助组织更好地应对数字化时代的风险与安全问题,实现可持续发展。

bread的博客 120

c用libcurl库实现https client实现get、post、文件上传、文件下载

c用libcurl库实现https client实现get、post、文件上传、文件下载 版本说明 版本 作者 日期 备注 0.1 loon 2019.4.2 初稿 目录 文章目录c用libcurl库实现https client实现get、post、文件上传、文件下载版本说明目录一、LibCurl基本编程框架二、一些基本的函数1. CURLcode curl_global_i...

逍遥游的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c++ 使用libcurl 发送http get/post请求

使用c++做httpclient时,可以使用libcurl库来解决,它是一个开源跨平台的网络协议库,可以去官网上下载源码编译使用,下载地址:https://curl.haxx.se/download.html,选择source archives中的一个。/docs目录有非常详细的文档,/docs/examples有很多使用的例子,有兴趣的可以看看。          至于怎么将源码编译成静态库文

waylyn_wu的专栏 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【小沐学C++】libcurl实现HTTP/HTTPS请求

libcurl 是一个免费且易于使用的客户端 URL 传输 库,支持DICT,FILE,FTP,FTPS,GOPHER,GOPHERS,HTTP,HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POPP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB、SMBS、SMTP、SMTPS、TELNET 和 TFTP。

爱看书的小沐 7952

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

libcurl的下载安装、使用,Get和Post访问http/https

libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。 libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传。 libcurl的官网下载curl - Download ;安装openssl。 ​

m0_69808624的博客 3176

【LibCurl】C++使用libcurl实现HTTP POST和GET、PUT

libcurl简介 libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证 libcurl的官网: http://curl.haxx.se/ 库...

橘嘉禾 1940

libcurl POST GET 完整步骤与源码

已在VS2017上测试验证。基于libcurl的c++ http POST 和 GET,含源码。

叶子的博客 6151

libcurl实现POST GET

1、POST int curl_post(void) { CURL *curl; CURLcode res; printf("[%s]start\n",__func__); /* In windows, this will init the winsock stuff */ curl_global_init(CURL_GLOBAL_ALL); /* get a curl handle */ curl = curl_easy_init(); if(curl) { // 设置POS

Eric 542

通过libcurl向服务端发送数据的2种方式:get/post

1.get方式发送数据     url格式:服务器url地址+ 接口url地址+"?"+发送的数据(特定格式),如:     http://172.16.3.123:8080/temp/getScreenImages?userDes=4E&userKey=D7B7BA3F24A84D738D8B7A15CC30201A&dataLen=0&data=   参考代码如下:get方式下载文件并传

llfwdd的专栏 1696

libcurl post二进制文件及GET下载文件

使用的版本curlcurl-7.69.1 使用的easy接口 1、二进制方式POST图片 CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); curl_easy_setopt(curl, CURLOPT_URL...

洛的博客 1184

高效网络请求利器:HTTP/HTTPS POST/GET 实现资源文件推荐

高效网络请求利器:HTTP/HTTPS POST/GET 实现资源文件推荐 去发现同类优质开源项目:https://gitcode.com/ 在现代软件开发中,网络请求是不可或缺的一部分。无论是从服务器获取数据,还是向服务器提交数据,HTTP/HTTPS的GET和POST方法都是最常用的手段。为了帮助开发者更高效地进行网络请求操作,我们推荐一个开源项目——HTTP/HTTPS POST/GET 实...

gitblog_09703的博客 1066

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

一、LibCurl基本编程框架 libcurl是一个跨平台的网络协议库,当前支持http,https,ftp,gopher,telnet,dict,file,和ldap协议。也支持HTTPS证书授权,HTTP POST, HTTP PUT,FTP 上传(当然你也可以使用PHP的ftp扩展),HTTP基本表单上传,代理,cookies,和用户认证 官网:https://curl.haxx.se/ 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启

Hello,My Friends~ 6320

使用libcurl 和 jsoncpp 实现JSON数据网络GET、POST (2019/6)

1. libcurl 和 jsoncpp库的准备 libcurl curl-7.65.0.zip 官网获取最新,一定注意最新的是在github,使用最新的 https://github.com/curl/curl 然后解压后进入curl-7.65.0\projects\Windows 选择对应版本编译使用就可以了。 note: 我在VS里面用静态库没问题,在Qt里面使用静态库有问题,用...

u014664846的博客 1660
上一篇: PHP超时处理全面总结
下一篇: C语言文件操作函数大全
3GUU_草根
博客等级 码龄14年 39粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值