通過curl下載文件

1. 適用範圍
      本文檔介紹SylixOS下通過curl中間件下載文件的流程,使用者應熟悉SylixOS以及curl中間件。

2. 下載流程
2.1 資源準備
    文件下載依賴curl中間件,故下載前需基於SylixOS進行curl中間件移植,移植過程本文檔不做詳細介紹,請參照《SylixOS下中間件移植手冊》。

2.2 下載流程
      文件下載前需獲取可用的下載url,使用curl中間件提供的接口進行文件下載。下載流程如程序清單 2.1所示。

程序清單 2.1  文件下載流程

#include <stdio.h>
#include <string.h>
#include "curl/curl.h"
/***************************************************************************
** 函數名稱: write_data
** 功能描述: 回調函數
** 輸  入  : ptr		寫數據指針
**           size	寫入塊字節數
**           nmemb  	寫數據塊數
**           stream 	目標文件指針
** 輸  出  : 寫入塊數
** 返  回  : written
***************************************************************************/
size_t  write_data (void  *ptr, size_t  size, size_t  nmemb, FILE  *stream)
{
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}
/***************************************************************************
** 函數名稱: fileDownload
** 功能描述: 下載函數
** 輸  入  : pcAddressUrl	下載地址
**           pcFileName  	下載文件名
** 輸  出  : NONE
** 返  回  : ERROR_NONE
***************************************************************************/
int fileDownload (char  *pcAddressUrl, char  *pcFileName)
{
    CURLcode    curlRet;

    CURL        *curl 	= LW_NULL;
    FILE        *fp      	= LW_NULL;

    char        *url     	= pcAddressUrl;                    /*  下載網址                    */
    char        *filename	= pcFileName;                      /*  下載文件名字                */

    curl = curl_easy_init();                                       /*  初始化 curl 會話            */
    if (!curl) {
        printf("curl_easy_init failed\n");
        return  (PX_ERROR);
    }

    fp = fopen(filename, "w+");                                    /*  打開文件                    */
    if (!fp) {
        printf("fopen failed\n");
        return  (PX_ERROR);
    }

    curlRet = curl_easy_setopt(curl, CURLOPT_URL, url);            /*  設置 url                    */
    if (curlRet != CURLE_OK) {
        fclose(fp);
        curl_easy_cleanup(curl);
        return  (PX_ERROR);
    }

    curlRet = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);/*  設置回調函數                */
    if (curlRet != CURLE_OK) {
        fclose(fp);
        curl_easy_cleanup(curl);
        return  (PX_ERROR);
    }

    curlRet = curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);      /*  設置寫入文件句柄             */
    if (curlRet != CURLE_OK) {
        fclose(fp);
        curl_easy_cleanup(curl);
        return  (PX_ERROR);
    }

    curlRet = curl_easy_perform(curl);                            /*  完成傳輸函數                */
    if (curlRet != CURLE_OK) {
        fclose(fp);
        curl_easy_cleanup(curl);
        return  (PX_ERROR);
    }

    fclose(fp);
    curl_easy_cleanup(curl);                  		         /*  釋放內存                    */

    return  (ERROR_NONE);
}
/***************************************************************************
** 函數名稱: main
** 功能描述: 進程主函數
** 輸  入  : argc    入參個數
**           argv    入參數組
** 輸  出  : NONE
** 返  回  : ERROR_CODE
***************************************************************************/
int  main (int  argc, char  **argv)
{
    int  iRet = -1;

    printf("start download...\n");

    /*
     *  下載文件
     *  UPDATE_URL       下載地址
     *  UPDATE_FILE_NAME 下載保存文件名
     */
    iRet = fileDownload(UPDATE_URL, UPDATE_FILE_NAME);
    if (iRet != ERROR_NONE) {
        printf("file down failed\n");
        return  (PX_ERROR);
    }

    return  (ERROR_NONE);
}

參考資料:libcurl官網源碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章