天天看點

使用libcurl實作的上傳器

頭檔案

使用libcurl實作的上傳器

/**********************************************************************

使用libcurl實作的上傳器

* Copyright (C) 2014 -  - All Rights Reserved

使用libcurl實作的上傳器

*

使用libcurl實作的上傳器

* 檔案名稱:        Uploader_LibCurl.h

使用libcurl實作的上傳器

* 摘    要:        上傳器 - LibCurl實作

使用libcurl實作的上傳器

*     

使用libcurl實作的上傳器

* 作    者:        yanglinbo,

使用libcurl實作的上傳器

* 修    改:        檢視檔案最下方.

使用libcurl實作的上傳器

使用libcurl實作的上傳器

***********************************************************************/

使用libcurl實作的上傳器
使用libcurl實作的上傳器

#ifndef __Uploader_LibCurl_H__

使用libcurl實作的上傳器

#define __Uploader_LibCurl_H__

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

#include <curl/curl.h>

使用libcurl實作的上傳器

#include <fstream>

使用libcurl實作的上傳器

#include <string>

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

class CUploader

使用libcurl實作的上傳器

{

使用libcurl實作的上傳器

public:

使用libcurl實作的上傳器

    CUploader(void);

使用libcurl實作的上傳器

    virtual ~CUploader(void);

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 線程入口函數

使用libcurl實作的上傳器

    virtual bool run();

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 啟動上傳

使用libcurl實作的上傳器

    virtual bool start(const std::string& strUrl, const std::string& strLocalFile);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 停止上傳

使用libcurl實作的上傳器

    virtual bool stop();

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 是否運作狀态

使用libcurl實作的上傳器

    bool isRunning() const;

使用libcurl實作的上傳器
使用libcurl實作的上傳器

protected:

使用libcurl實作的上傳器

    /// 讀取回調

使用libcurl實作的上傳器

    static size_t handleRead(void *buffer, size_t size, size_t nmemb, void *userp);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 進度回調

使用libcurl實作的上傳器

    static size_t handleProgress(void *buffer, double dltotal, double dlnow, double ultotal, double ulnow);

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    size_t onUpload(void *buffer, size_t size, size_t nmemb);

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    size_t onProgress(const double& ultotal, const double& ulnow);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 上傳回調

使用libcurl實作的上傳器

    void onUpload();

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 設定libcurl選項

使用libcurl實作的上傳器

    bool setOption();

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    /// 清除資料

使用libcurl實作的上傳器

    void clear();

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    CURL*            m_pCurl;                ///< libcurl句柄

使用libcurl實作的上傳器

    FILE*            m_pFile;                ///< 檔案指針

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    bool            m_bRunning;                ///< 運作标志

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    std::string        m_strRemoteUrl;            ///< 遠端連結

使用libcurl實作的上傳器

    std::string        m_strLocalFilePath;        ///< 本地檔案路徑

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    size_t            m_nLocalFileSize;        ///< 本地檔案大小

使用libcurl實作的上傳器

};

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

#endif

使用libcurl實作的上傳器

實作檔案

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

* 檔案名稱:        Uploader_LibCurl.cpp

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

#include "StdAfx.h"

使用libcurl實作的上傳器

#include "Uploader.h"

使用libcurl實作的上傳器

#include <sys/stat.h>

使用libcurl實作的上傳器

#include <fcntl.h>

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

CUploader::CUploader(void)

使用libcurl實作的上傳器

: m_pCurl(NULL)

使用libcurl實作的上傳器

, m_pFile(NULL)

使用libcurl實作的上傳器

, m_bRunning(false)

使用libcurl實作的上傳器

, m_nLocalFileSize(0)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

}

使用libcurl實作的上傳器
使用libcurl實作的上傳器

CUploader::~CUploader(void)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    stop();

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

bool CUploader::run()

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    onUpload();

使用libcurl實作的上傳器

    return true;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

bool CUploader::isRunning() const

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    return m_bRunning;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

void CUploader::clear()

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    if (m_pFile)

使用libcurl實作的上傳器

    {

使用libcurl實作的上傳器

        fclose(m_pFile);

使用libcurl實作的上傳器

        m_pFile = NULL;

使用libcurl實作的上傳器

    }

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    if (m_pCurl)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

        curl_easy_cleanup(m_pCurl);

使用libcurl實作的上傳器

        m_pCurl = NULL;

使用libcurl實作的上傳器

        curl_global_cleanup();

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    m_strRemoteUrl.clear();

使用libcurl實作的上傳器

    m_strLocalFilePath.clear();

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    m_nLocalFileSize = 0;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

bool CUploader::setOption()

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 遠端URL,支援 http, https, ftp

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_URL, m_strRemoteUrl.c_str());

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)m_nLocalFileSize);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 設定User-Agent

使用libcurl實作的上傳器

    std::string useragent = _T("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1");

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_USERAGENT, useragent.c_str());

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 設定重定向的最大次數

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_MAXREDIRS, 5);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 設定301、302跳轉跟随location

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_FOLLOWLOCATION, 1);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_UPLOAD, TRUE);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_NOSIGNAL, 1L);

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_POST, TRUE);

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_FORBID_REUSE, TRUE);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 上傳内容回調函數

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, handleRead);

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_READDATA, this);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 進度回調函數

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_NOPROGRESS, 0);

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSDATA, this);

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_PROGRESSFUNCTION, handleProgress);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 跳過伺服器SSL驗證,不使用CA憑證

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYPEER, 0L);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 驗證伺服器端發送的證書,預設是 2(高),1(中),0(禁用)

使用libcurl實作的上傳器

    curl_easy_setopt(m_pCurl, CURLOPT_SSL_VERIFYHOST, 0L);

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

bool CUploader::start(const std::string& strUrl, const std::string& strLocalFile)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    if (strUrl.empty()) return false;

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    if (m_bRunning == true) return true;

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    clear();

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    m_strRemoteUrl    = strUrl;

使用libcurl實作的上傳器

    m_strLocalFilePath    = strLocalFile;

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 打開檔案

使用libcurl實作的上傳器

    m_pFile = fopen(m_strLocalFilePath.c_str(), "rb");

使用libcurl實作的上傳器

    if (m_pFile == NULL)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

        return false;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 擷取檔案大小

使用libcurl實作的上傳器

    struct stat file_info;

使用libcurl實作的上傳器

    if (fstat(fileno(m_pFile), &file_info) != 0) 

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    m_nLocalFileSize = file_info.st_size;

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 初始化libcurl

使用libcurl實作的上傳器

    m_pCurl = curl_easy_init();

使用libcurl實作的上傳器

    if (m_pCurl == NULL)

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 設定libcurl的選項

使用libcurl實作的上傳器

    setOption();

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    m_bRunning = true;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

bool CUploader::stop()

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    m_bRunning = false;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

size_t CUploader::handleRead( void *buffer, size_t size, size_t nmemb, void *userp )

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    CUploader* pDownloader = (CUploader*) userp;

使用libcurl實作的上傳器

    if (pDownloader)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

        return pDownloader->onUpload(buffer, size, nmemb);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    return 0;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

size_t CUploader::handleProgress( void *buffer, double dltotal, double dlnow, double ultotal, double ulnow )

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    CUploader* pDownloader = (CUploader*) buffer;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

        pDownloader->onProgress(ultotal, ulnow);

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

size_t CUploader::onProgress( const double& ultotal, const double& ulnow )

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    TRACE("%.2f / %.2f (%.2g %%)\n", ulnow, ultotal, ulnow*100.0/ultotal);

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

size_t CUploader::onUpload( void *buffer, size_t size, size_t nmemb )

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    size_t return_size = fread(buffer, size, nmemb, m_pFile);

使用libcurl實作的上傳器

    return return_size;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

void CUploader::onUpload()

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 執行上傳

使用libcurl實作的上傳器

    CURLcode return_code = CURLE_OK;

使用libcurl實作的上傳器

    return_code = curl_easy_perform(m_pCurl);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 關閉檔案

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 上傳失敗

使用libcurl實作的上傳器

    if (return_code != CURLE_OK)

使用libcurl實作的上傳器
使用libcurl實作的上傳器

        return;

使用libcurl實作的上傳器
使用libcurl實作的上傳器
使用libcurl實作的上傳器

    // 擷取狀态碼

使用libcurl實作的上傳器

    int response_code = 0;

使用libcurl實作的上傳器

    curl_easy_getinfo(m_pCurl, CURLINFO_RESPONSE_CODE, &response_code);

使用libcurl實作的上傳器
使用libcurl實作的上傳器

示例代碼:

使用libcurl實作的上傳器

CUploader uploader

使用libcurl實作的上傳器

uploader.start("ftp://upload:[email protected]/hello.exe", "C:\\fly.exe");

使用libcurl實作的上傳器

uploader.run();

繼續閱讀