Barra laterale

programmazione:libcurl:scaricare_un_file_dal_web

Scaricare un file dal web con LibCurl

Autore: Fabio Di Matteo
Ultima revisione: 14/02/2011

Con libCurl e' possibile scaricare e caricare file in molti tipi di server semplicemente specificando la Url.

Di seguito un'esempio ben commentato mostrera' come scaricare un file dal web.L'esempio in questione, volutamente semplice, ha l'intenzione di far comprendere velocemente l'utilizzo di base di libcurl .

Altri esempi più complessi possono essere scaricati da questa pagina: http://curl.haxx.se/libcurl/c/example.html

Scaricare un file dal web

main.c

#include <stdio.h>
#include <curl/curl.h>
 
 
/* Link utili:
 * http://curl.haxx.se/libcurl/c/example.html
*/
 
/* Questa funzione e' opzionale per quello che faremo noi, e' una callback
 * che se si vuole si puo' attivare non appena riceviamo i dati, per svolgere su
 * essi qualsiasi compito.*/
static size_t callback(void *buffer, size_t size, size_t nmemb, void *stream);
 
 
 
 
int main(void)
{
   CURL *curl;
   CURLcode res;
 
 
   curl = curl_easy_init();
   if(curl) {
 
     /*Settiamo la URL del nostro file*/
     curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.it/search?hl=it&q=ciao&btnG=Cerca+con+Google");
 
     /* Opzionale - Colleghiamo la funzione "callback" 
      * questa funzione viene eseguita non appena viene invocato curl_easy_perform()*/
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
 
 
 	/* Apriamo un file che conterra la nostra pagina scaricata
         *  potrebbe anche essere un altro tipo di file.*/
    	FILE *f = fopen("file.html","w");
    	if (f == NULL) {
      		curl_easy_cleanup(curl);
      		return -1;
    	}
 
	/* Con questa istruzione scriviamo i dati catturati dall'url nel file f */
    	curl_easy_setopt(curl,CURLOPT_WRITEDATA, f);
 
 
     /* Esegue tutte le istruzioni che abbiam dati fin ora, res conterra 
      * il codice d'errore */
     res = curl_easy_perform(curl);
 
     /* Pulisce il nostro handle  */
     curl_easy_cleanup(curl);
     fclose(f);
 
   }
   return 0;
 }
 
 
size_t callback(void *buffer, size_t size, size_t nmemb, void *stream){
	int written = fwrite(buffer, size, nmemb, (FILE *)stream);
	/* Questa callback viene attivata non appena viene conclusa
	 * curl_easy_perform(), non serve a nulla e' solo dimostrativa.
	 * Puo' svolgere qualsiasi compito sui dati catturati dall URL .
	 * La variabile buffer contiene i dati catturati. */
    	return written;
}

Il makefile

I nostri progetti possono essere linkati a libcurl sia in maniera statica che dinamica, passando adeguatamente i parametri al programma curl-config .
Da notare infatti che cambia soltanto la seconda riga, infatti OPTS = `curl-config –static-libs` e invece OPTS = `curl-config –cflags –libs` per la compilazione dinamica

CPP = gcc 
OPTS =  `curl-config --static-libs`
all:
	$(CPP)   main.c -o main $(OPTS)

clean:
	rm main
CPP = gcc 
OPTS = `curl-config --cflags  --libs` 

all:
	$(CPP)   main.c -o main $(OPTS)

clean:
	rm main

Mostrare l'avanzamento del download

Per arricchire il nostro esempio potremmo fare in modo da mostrare l'avanzamento del download tramite la nostra callback int progress( void* ptr, double t, double d, ouble ultotal,double ulnow); in questo modo:

#include <stdio.h>
#include <curl/curl.h>
 
 
static size_t writecallback(void *buffer, size_t size, size_t nmemb, void *stream);
int progress( void* ptr, double t, /* dltotal */ 
              double d, /* dlnow */ 
              double ultotal,
              double ulnow);
 
 
int main(void)
{
   CURL *curl;
   CURLcode res;
 
 
   curl = curl_easy_init();
   if(curl) {
 
     /*Settiamo la URL del nostro file*/
     curl_easy_setopt(curl, CURLOPT_URL, "http://gapil.truelite.it/gapil.pdf");
 
 
 	/* Apriamo un file che conterra la nostra pagina scaricata */
    	FILE *f = fopen("file.pdf","w");
    	if (f == NULL) {
      		curl_easy_cleanup(curl);
      		return -1;
    	}
 
		/* Con questa istruzione scriviamo i dati catturati dall'url nel file f */
		curl_easy_setopt(curl,CURLOPT_WRITEDATA, f);
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecallback);
 
		/*Per l'avanzamento dello stato del dowload*/
		curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
		curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress);
 
		 /* Esegue tutte le istruzioni che abbiam dati fin ora, res conterra 
		  * il codice d'errore */
		 res = curl_easy_perform(curl);
 
		 /* Pulisce il nostro handle  */
		 curl_easy_cleanup(curl);
                 fclose(f);
 
   }
   return 0;
 }
 
 
size_t writecallback(void *buffer, size_t size, size_t nmemb, void *stream){
 
	int written = fwrite(buffer, size, nmemb, (FILE *)stream);
   	return written;
}
 
int progress( void* ptr, 
				double t, /* dltotal */ 
				double d, /* dlnow */ 
				double ultotal,
				double ulnow)
{
 
	/*Progresso in Kilobyte*/
	//printf("Dl->%4.2f kb di %d kb\n",d/1024, (int)t/1024);
 
        /*Progresso in percentuale*/
	double percento= d*100/t;
	printf("Scaricato il %d% \n", (int)percento);
 
	return 0;
 
}

programmazione/libcurl/scaricare_un_file_dal_web.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)