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


各位亲 有时间可以去看看我的  “金骏家居淘宝店” 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




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值