2011-07-11 17 views
5

Quería usar libcurl para un proyecto que implica obtener una imagen de una página web. La URL tiene el siguiente aspecto:Cómo guardar imágenes utilizando libcurl

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

Usando el enrollamiento de línea de comandos que puedo recuperar la imagen usando

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

Quiero saber el equivalente a este código en libcurl porque yo estoy nueces ahora mismo. Tengo esta fuente de muestra en la red, y compila y cosas, pero no puedo ver el archivo de imagen en ninguna parte.

Este es el código:

#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; 
} 

Por cierto estoy usando un Mac y estoy compilar este código en XCode que tiene una biblioteca libcurl.

* EDITAR: * Problema solucionado. Acabo de usar una ruta completa para el fopen(). Gracias Mat! Responde la pregunta para que pueda elegir la tuya como la respuesta correcta. ¡Gracias!

+0

Utilice una ruta completa en la llamada 'abierta' para que sepa dónde buscar. – Mat

+0

Lo intentaré. Pero, ¿cómo lo hago con mac? Sé cómo hacerlo en el sistema de archivos de Windows, pero no en una Mac. Gracias. – IBG

+0

¿Cómo le envío un mensaje al tipo que comentó? Solucioné el problema gracias a ese tipo. Hola Mat, por favor responde, para que pueda elegir tu respuesta. ¡Gracias! – IBG

Respuesta

3

Utilice una ruta completa en la llamada abierta para que sepa dónde buscar.

También debe consultar la función perror para que pueda imprimir la razón por la cual la apertura falla cuando lo hace, ahorra algunos dolores de cabeza.

Última cosa: inicializar fp en nulo, o solo fclose(fp) si estaba realmente abierto. Tal como está, si curl_easy_init falla, intentará fclose un puntero al azar.

+0

¡Gracias por la respuesta y por la información adicional! – IBG