2012-04-11 63 views
2

我想通過從服務器(網站)下載圖像設置一個旋轉的背景圖像,並試圖用curl做到這一點,但有0成功做到這一點。我的代碼(縮寫)版本如下。我沒有收到錯誤,但是,如何將此圖像「暫時」保存爲我的背景?有沒有圖像(型變量)或什麼?從服務器下載圖像(cUrl,但採取建議)C++

這只是一個學習的經驗,所以任何圖書館或建議將不勝感激。

#include <curl/curl.h> 
CURL *curlCtx = curl_easy_init(); 
curl_easy_setopt(curlCtx, CURLOPT_URL, "http://www.examplesite.com/testimage.jpeg"); 
curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA, this); 
curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, callbackfunction); 
const CURLcode rc = curl_easy_perform(curlCtx); 
if(rc == CURLE_OK){ 
    //it worked 
} 


size_t callbackfunction(char *data, size_t size, size_t nmemb, void *stream){ 
    //do something here with image...? 
} 

謝謝, 詹姆斯

編輯:對不起,我加()錯誤地callbackFunction參數。

+0

您在第5行寫了'callbackfunction()'而不是'callbackfunction'。 – Blindy 2012-04-11 20:20:07

回答

6

你的代碼甚至沒有編譯! URG!

應該實現callbackfunction()來處理傳入的數據流。在這種情況下,我想你想把數據寫入一個文件中,對吧?

檢查呼叫的返回情況總是很好的做法,因此請仔細閱讀我分享的源代碼並仔細研究。下面的程序完成了你想要做的事情。

dw.cpp

#include <stdio.h> 
#include <curl/curl.h> 

size_t callbackfunction(void *ptr, size_t size, size_t nmemb, void* userdata) 
{ 
    FILE* stream = (FILE*)userdata; 
    if (!stream) 
    { 
     printf("!!! No stream\n"); 
     return 0; 
    } 

    size_t written = fwrite((FILE*)ptr, size, nmemb, stream); 
    return written; 
} 

bool download_jpeg(char* url) 
{ 
    FILE* fp = fopen("out.jpg", "wb"); 
    if (!fp) 
    { 
     printf("!!! Failed to create file on the disk\n"); 
     return false; 
    } 

    CURL* curlCtx = curl_easy_init(); 
    curl_easy_setopt(curlCtx, CURLOPT_URL, url); 
    curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA, fp); 
    curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, callbackfunction); 
    curl_easy_setopt(curlCtx, CURLOPT_FOLLOWLOCATION, 1); 

    CURLcode rc = curl_easy_perform(curlCtx); 
    if (rc) 
    { 
     printf("!!! Failed to download: %s\n", url); 
     return false; 
    } 

    long res_code = 0; 
    curl_easy_getinfo(curlCtx, CURLINFO_RESPONSE_CODE, &res_code); 
    if (!((res_code == 200 || res_code == 201) && rc != CURLE_ABORTED_BY_CALLBACK)) 
    { 
     printf("!!! Response code: %d\n", res_code); 
     return false; 
    } 

    curl_easy_cleanup(curlCtx); 

    fclose(fp); 

    return true; 
} 

int main(int argc, char** argv) 
{ 
    if (argc < 2) 
    { 
     printf("Usage: %s <url>\n", argv[0]); 
     return -1; 
    } 

    if (!download_jpeg(argv[1])) 
    { 
     printf("!! Failed to download file: %s\n", argv[1]); 
     return -1; 
    } 

    return 0; 
} 

編譯時:g++ dw.cpp -o dw -lcurl和測試了:

./dw http://unicornify.appspot.com/avatar/51d623f33f8b83095db84ff35e15dbe8?s=128 

這個應用程序創建一個名爲out.jpg用它下載的數據的磁盤上的文件。

+1

謝謝!你讓我的生活變得更輕鬆。 – user1071840 2013-12-25 19:08:03