2012-04-11 46 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