天天看点

使用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();

继续阅读