ucrl,libcurl 实现上传下载

来源:互联网 发布:java log4j日志覆盖 编辑:程序博客网 时间:2024/05/16 09:20

libcurl 库是一个非常强大,好非常好用的 上传下载的库可以很好的支持 FTP SCP HTTP 等等协议。

下面的代码是C++代码,里面用了libcurl库进行上传下载。并以封装类的形式给出

/*** CUrlClient.h* @file 说明信息..* DATE January 28 2015* * @author Ming_zhang*/ #ifndef _CURLCLIENT_H_#define _CURLCLIENT_H_/***********************Global Variable Declare***************///#define    -1;    ///< 定义 的宏为0。
<pre name="code" class="cpp">#define RET_OK 1#define RET_FAIL 0#define WLI TRACE #define WLE TRACE#define ENTER_FUN(fun_name)\<span></span>const char _FUN_[] =#fun_name;

                                  ///////////////////////////////////////////////////////////////************************INCLUDE FILES*************************///#define CURL_STATICLIB #include "curl/curl.h"#include <string>using namespace std;////////////////////////////////////////////////////////////////*** @brief 通过libcurl进行文件的上传下载 客户端**/class CUrlClient{public:// Constructors & DestructorCUrlClient();virtual ~CUrlClient();static void Init();static void ClearUp();// Interface //设置代理 默认 socks4int SetProxy(string sIp,int nPort,string sUser,string sPasswd,int nType=CURLPROXY_SOCKS4);//设置登录用户名密码int SetLoginInfo(string sUser,string sPasswd);int SetConnectTimeout(long nTimeOutSecond);int DownloadFile(string sUrl,string sLocalFile);int UploadFile(string sUrl,string sLocalFile);private://进度回度函数static int STATIC_CALLBACK_Progress(void *clientp,curl_off_t dltotal,curl_off_t dlnow,curl_off_t ultotal,curl_off_t ulnow);static size_t STATIC_CALLBACK_Write(char *ptr, size_t size, size_t nmemb, void *userdata);static size_t STATIC_CALLBACK_Read(char *buffer, size_t size, size_t nitems, void *instream);int CALLBACK_Progress(curl_off_t dltotal,curl_off_t dlnow,curl_off_t ultotal,curl_off_t ulnow);size_t CALLBACK_Write(char *ptr, size_t size, size_t nmemb);size_t CALLBACK_Read(char *buffer, size_t size, size_t nitems);private:CURL *m_Handle;FILE *m_pFile;//收到的文件//int var1;  ///< };#endif

/*** CUrlClient.cpp* @file 说明信息..* DATE January 28 2015* * @author Ming_zhang*/ /************************INCLUDE FILES*************************/#include "stdafx.h"#include <sstream>#include "CUrlClient.h"#pragma  comment(lib,"Ws2_32.lib")#pragma  comment(lib,"Wldap32.lib")#ifdef _DEBUG#pragma  comment(lib,"libcurl.lib")#else#pragma  comment(lib,"libcurl.lib")#endif /////////////////////////////////////////////////////////////////进度回调int CUrlClient::STATIC_CALLBACK_Progress(void *clientp,curl_off_t dltotal,curl_off_t dlnow,curl_off_t ultotal,curl_off_t ulnow){CUrlClient *pThis = (CUrlClient*)clientp;if(pThis!=NULL)pThis->CALLBACK_Progress(dltotal,dlnow,ultotal,ulnow);return 0;}//收到数据回调size_t CUrlClient::STATIC_CALLBACK_Write(char *ptr, size_t size, size_t nmemb, void *userdata){CUrlClient *pThis = (CUrlClient*)userdata;if(pThis!=NULL)pThis->CALLBACK_Write(ptr,size,nmemb);return size*nmemb;}size_t CUrlClient::STATIC_CALLBACK_Read(char *buffer, size_t size, size_t nitems, void *instream){CUrlClient *pThis = (CUrlClient*)instream;if(pThis!=NULL){return pThis->CALLBACK_Read(buffer,size,nitems);}return 0;}void CUrlClient::Init(){curl_global_init(CURL_GLOBAL_ALL);curl_version_info_data *pVersion = curl_version_info(CURLVERSION_FIRST);WLI("libcurl Version: [%s]\n",pVersion->version);}void CUrlClient::ClearUp(){curl_global_cleanup();}CUrlClient::CUrlClient():m_Handle(NULL),m_pFile(NULL){m_Handle = curl_easy_init();curl_easy_setopt(m_Handle,CURLOPT_PROTOCOLS,CURLPROTO_ALL);//设置进度回调curl_easy_setopt(m_Handle,CURLOPT_XFERINFODATA,this);curl_easy_setopt(m_Handle,CURLOPT_XFERINFOFUNCTION,&CUrlClient::STATIC_CALLBACK_Progress);//设置写数据回调-下载curl_easy_setopt(m_Handle,CURLOPT_WRITEDATA,this);curl_easy_setopt(m_Handle, CURLOPT_WRITEFUNCTION, &CUrlClient::STATIC_CALLBACK_Write);//设置读数据回调-上传curl_easy_setopt(m_Handle,CURLOPT_READDATA,this);curl_easy_setopt(m_Handle, CURLOPT_READFUNCTION, &CUrlClient::STATIC_CALLBACK_Read);//设置TCP keep alivecurl_easy_setopt(m_Handle,CURLOPT_TCP_KEEPALIVE,1);curl_easy_setopt(m_Handle, CURLOPT_FTP_CREATE_MISSING_DIRS, CURLFTP_CREATE_DIR);}CUrlClient::~CUrlClient(){curl_easy_cleanup(m_Handle);m_Handle = NULL;}int CUrlClient::SetProxy(string sIp,int nPort,string sUser,string sPasswd,int nType){ENTER_FUN(CUrlClient::SetProxy);WLI("<%s>Info: ip[%s] port[%d] user[%s] passwd[%s]\n",_FUN_,sIp.c_str(),nPort,sUser.c_str(),sPasswd.c_str());if(m_Handle==NULL){WLE("<%s>Error: m_Handle==NULL\n",_FUN_);return RET_FAIL;}curl_proxytype oproxytype = (curl_proxytype)nType;curl_easy_setopt(m_Handle, CURLOPT_PROXYTYPE, oproxytype); //设置代码类型stringstream ssProxyHost;ssProxyHost<<sIp<<":"<<nPort;curl_easy_setopt(m_Handle, CURLOPT_PROXY, ssProxyHost.str().c_str());stringstream ssUserPasswd;ssUserPasswd<<sUser<<":"<<sPasswd;curl_easy_setopt(m_Handle, CURLOPT_PROXYUSERPWD, ssUserPasswd.str().c_str());  //SSL private key return RET_OK;}int CUrlClient::SetLoginInfo(string sUser,string sPasswd){ENTER_FUN(CUrlClient::SetLoginInfo);if(m_Handle==NULL){WLE("<%s>Error: m_Handle==NULL\n",_FUN_);return RET_FAIL;}stringstream ssUserPasswd;ssUserPasswd<<sUser<<":"<<sPasswd;curl_easy_setopt(m_Handle, CURLOPT_USERPWD, ssUserPasswd.str().c_str()); return RET_OK;}int CUrlClient::SetConnectTimeout(long nTimeOutSecond){ENTER_FUN(CUrlClient::SetConnectTimeout);WLI("<%s>Info : nTimeOutSecond[%s]",_FUN_,nTimeOutSecond);if(m_Handle==NULL){WLE("<%s>Error: m_Handle==NULL\n",_FUN_);return RET_FAIL;}curl_easy_setopt(m_Handle, CURLOPT_CONNECTTIMEOUT, nTimeOutSecond); return RET_OK;}//进度回调int CUrlClient::CALLBACK_Progress(curl_off_t dltotal,curl_off_t dlnow,curl_off_t ultotal,curl_off_t ulnow){ENTER_FUN(CUrlClient::CALLBACK_Progress);WLI("<%s>Info: dltotal[%d],dlnow[%d],ultotal[%d],ulnow[%d]  \n",_FUN_,dltotal,dlnow,ultotal,ulnow);return RET_OK;}//返回值,处理了多少数据size_t CUrlClient::CALLBACK_Write(char *ptr, size_t size, size_t nmemb){if(m_pFile!=NULL){fwrite(ptr,size,nmemb,m_pFile);fflush(m_pFile);}return size*nmemb;}size_t CUrlClient::CALLBACK_Read(char *buffer, size_t size, size_t nitems){size_t nRealRead = 0;if(m_pFile!=NULL){nRealRead = fread(buffer,size,nitems,m_pFile);}return nRealRead;}int CUrlClient::DownloadFile( string sUrl,string sLocalFile ){ENTER_FUN(CUrlClient::DownloadFile);WLI("<%s>Info: URL[%s] sLcalPath[%s]\n",_FUN_,sUrl.c_str(),sLocalFile.c_str());if(m_Handle==NULL){WLE("<%s>Error: m_Handle==NULL\n",_FUN_);return RET_FAIL;}m_pFile = fopen(sLocalFile.c_str(),"wb");if(m_pFile==NULL){WLE("<%s>Error: fopen == NULL [%s]\n",_FUN_,sLocalFile.c_str());return RET_FAIL;}//重新设置下载进度,curl_easy_setopt(m_Handle,CURLOPT_NOPROGRESS,0);curl_easy_setopt(m_Handle,CURLOPT_UPLOAD,0);//0表示下载CURLcode res;curl_easy_setopt(m_Handle, CURLOPT_URL, sUrl.c_str());res = curl_easy_perform(m_Handle);if(res!=CURLE_OK){WLE("<%s>Error: curl_easy_perform == [%d]\n",_FUN_,res);fclose(m_pFile);return RET_FAIL;}fclose(m_pFile);m_pFile = NULL;WLI("<%s>Info: Success URL[%s] sLcalPath[%s] \n",_FUN_,sUrl.c_str(),sLocalFile.c_str());return RET_OK;}int CUrlClient::UploadFile(string sUrl,string sLocalFile){ENTER_FUN(CUrlClient::UploadFile);WLI("<%s>Info: URL[%s] sLcalPath[%s]\n",_FUN_,sUrl.c_str(),sLocalFile.c_str());if(m_Handle==NULL){WLE("<%s>Error: m_Handle==NULL\n",_FUN_);return RET_FAIL;}m_pFile = fopen(sLocalFile.c_str(),"rb");if(m_pFile==NULL){WLE("<%s>Error: fopen == NULL [%s]\n",_FUN_,sLocalFile.c_str());return RET_FAIL;}//取得文件大小fseek(m_pFile,0,SEEK_END);curl_off_t nFileSize =ftell(m_pFile);fseek(m_pFile,0,SEEK_SET);//设置要上传的文件大小curl_easy_setopt(m_Handle, CURLOPT_INFILESIZE_LARGE, nFileSize);//重新设置下载进度,curl_easy_setopt(m_Handle,CURLOPT_NOPROGRESS,0);curl_easy_setopt(m_Handle,CURLOPT_UPLOAD,1);//表示上传CURLcode res;curl_easy_setopt(m_Handle, CURLOPT_URL, sUrl.c_str());res = curl_easy_perform(m_Handle);if(res!=CURLE_OK){WLE("<%s>Error: curl_easy_perform == [%d]\n",_FUN_,res);fclose(m_pFile);return RET_FAIL;}fclose(m_pFile);m_pFile =NULL;WLI("<%s>Info: Success URL[%s] sLcalPath[%s] \n",_FUN_,sUrl.c_str(),sLocalFile.c_str());return RET_OK;}


0 0
原创粉丝点击