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
/*
* @Description: 基於libcurl的同步 http post方法
* @prama[aUrl]: post請求的url
* @prama[aPostData]:post給伺服器的資料
* @prama[&aResponseData]: post請求到的資料
* @return: 操作結果 @see CURLcode
*/
staticint SimpleSyncPost(conststd::string& aUrl,const
/*
* @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