1. 程式人生 > >libcurl post/get上傳下載檔案 以及斷點下載(操作libcurl 實現斷點下載(續點續傳))

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,const

std::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"

usingnamespace 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