Как сохранить изображение с помощью libcurl - PullRequest
6 голосов
/ 11 июля 2011

Я хотел использовать libcurl для проекта, который включает в себя получение изображения с веб-страницы. URL выглядит так:

http://xxx.xxx.xxx.xxx/cgi-bin/anonymous/image.jpg

Используя командную строку cURL, я могу получить изображение, используя

$curl -o sampleimage.jpg http://xxx.xxx.xxx.xxx/cgi-bin/anonymous/image.jpg

Я хочу знать эквивалент этого кода в libcurl, потому что я схожу с ума прямо сейчас. Я получил этот пример источника в сети, он компилируется и все такое, но я нигде не вижу файл изображения.

Это код:

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

using namespace std; 

int main(){ 
CURL *image; 
CURLcode imgresult; 
FILE *fp; 

image = curl_easy_init(); 
if( image ){ 
    // Open file 
    fp = fopen("google.jpg", "wb"); 
    if( fp == NULL ) cout << "File cannot be opened"; 

    curl_easy_setopt(image, CURLOPT_URL, "http://192.168.16.25/cgi-bin/viewer/video.jpg"); 
    curl_easy_setopt(image, CURLOPT_WRITEFUNCTION, NULL); 
    curl_easy_setopt(image, CURLOPT_WRITEDATA, fp); 


    // Grab image 
    imgresult = curl_easy_perform(image); 
    if( imgresult ){ 
        cout << "Cannot grab the image!\n"; 
    } 
} 

// Clean up the resources 
curl_easy_cleanup(image); 
// Close the file 
fclose(fp); 
return 0; 
} 

Кстати, я использую Mac и компилирую этот код в XCode, в котором есть библиотека libcurl.

* РЕДАКТИРОВАТЬ: * Проблема исправлена. Я просто использовал полный путь для fopen (). Спасибо, Мат! Пожалуйста, ответьте на вопрос, чтобы я мог выбрать ваш как правильный ответ. Спасибо!

1 Ответ

3 голосов
/ 11 июля 2011

Используйте полный путь в вызове open, чтобы вы знали, где искать.

Также вы должны взглянуть на функцию perror, чтобы вы могли напечатать причину, по которой открытие завершается неудачно, когда это происходит - сохраняетнесколько головных болей.

Последнее: инициализируйте fp нулем или только fclose(fp), если оно действительно открыто.В настоящее время, если curl_easy_init не удается, вы попытаетесь fclose случайный указатель.

...