Estoy construyendo una aplicación (en Windows usando Dev-C++) y quiero que descargue un archivo. Estoy haciendo esto usando libcurl (ya he instalado el código fuente usando Packman). Encontré un ejemplo de trabajo (http://siddhantahuja.wordpress.com/2009/04/12/how-to-download-a-file-from-a-url-and-save-onto-local-directory-in-c-using-libcurl/) pero no cierra el archivo después de que se completa la descarga. Me gustaría que alguien diera un ejemplo sobre cómo descargar un archivo, ya sea en c o C++. ¡Gracias por adelantado!Descargar archivo usando libcurl en C/C++
Respuesta
El ejemplo que está utilizando es incorrecto. Consulte la página del manual para easy_setopt. En el ejemplo, write_data usa su propio ARCHIVO, * archivo de salida, y no el fp que se especificó en CURLOPT_WRITEDATA. Es por eso que cerrar fp causa problemas, ni siquiera se abre.
Esto es más o menos lo que debe ser similar (sin libcurl disponible aquí para probar)
#include <stdio.h>
#include <curl/curl.h>
/* For older cURL versions you will also need
#include <curl/types.h>
#include <curl/easy.h>
*/
#include <string>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
int main(void) {
CURL *curl;
FILE *fp;
CURLcode res;
char *url = "http://localhost/aaa.txt";
char outfilename[FILENAME_MAX] = "C:\\bbb.txt";
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
Actualizado: como sugiere @rsethc types.h
y easy.h
no están presentes en las versiones actuales de cURL nunca más.
He intentado esto (en OSX), pero me estoy haciendo: advertencia: desaprobado conversión de constante a 'char *' símbolos no definidos cadena: "___gxx_personality_v0", hace referencia a partir de: _main en ccHRyU1T.o write_data (void *, unsigned long, unsigned long, __sFILE *) en ccHRyU1T.o CIE en ccHRyU1T.o ld: símbolo (s) no encontrado collect2: ld returned 1 estado de salida Help please !! – TCB13
@ TCB13 el programa que escribí es C, no C++. Vuelva a compilar como C y los problemas deberían desaparecer. – fvu
+1 porque creo que el OP debería haber seleccionado esto como la respuesta, porque el código es prácticamente el mismo. – alexy13
Solo para los interesados puede evitar escribir una función personalizada pasando NULL como último parámetro (si no tiene la intención de hacer un procesamiento adicional de los datos devueltos).
En este caso, se utiliza la función interna predeterminada.
detalles
http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTWRITEDATA
Ejemplo
#include <stdio.h>
#include <curl/curl.h>
int main(void)
{
CURL *curl;
FILE *fp;
CURLcode res;
char *url = "http://stackoverflow.com";
char outfilename[FILENAME_MAX] = "page.html";
curl = curl_easy_init();
if (curl)
{
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}
Esto no funciona en Windows. En Windows debe configurar CURLOPT_WRITEFUNCTION no nulo; de lo contrario, se produce un bloqueo. Ver https://curl.haxx.se/libcurl/c/CURLOPT_WRITEDATA.html –
@PhilRosenberg Bueno, esto suena desafortunado, ya que aquí https://curl.haxx.se/libcurl/c/CURLOPT_WRITEFUNCTION.html # DESCRIPTION indica claramente: "Establezca esta opción en NULL para obtener la función predeterminada interna utilizada en lugar de su devolución de llamada". Por lo tanto, esto "Si está utilizando libcurl como una DLL win32, DEBE usar la CURLOPT_WRITEFUNCTION si establece esta opción o experimentarás caídas ". no debería tener ningún efecto, ya que nuevamente se debería usar la función interna. – Petar
- 1. Guardar un archivo usando libcurl en C
- 2. Usando LibCURL C++
- 3. usando libcurl sin dll
- 4. Usando libcurl & SSL
- 5. ¿descargar archivo zip usando java?
- 6. Descargar un archivo usando Javascript
- 7. Descargar un archivo usando HTTP en WebDriver
- 8. Descargar el archivo CSV usando "AJAX"
- 9. Descargar archivo usando descarga parcial (HTTP)
- 10. Usando libcurl para subir archivos a DropBox
- 11. Descargar archivo usando Java Common Apache?
- 12. Usando libcurl en iOS 5 como alternativa a NSURLConnection
- 13. petición HTTP GET usando C SIN libCurl
- 14. Subiendo a Amazon S3 usando cURL/libcurl
- 15. libcurl y imap
- 16. ¿Cómo descargar un archivo usando curl en php?
- 17. Descargar un archivo en D
- 18. ¿Cómo PUESO un buffer de JSON usando libcurl?
- 19. portando libcurl en android con soporte ssl
- 20. ¿Cómo puedo descargar eficientemente un archivo grande usando Go?
- 21. Descargar un archivo de Internet usando Java: ¿Cómo autenticar?
- 22. ¿Cómo puedo descargar un archivo XML usando C#?
- 23. ¿Cómo descargar un archivo usando el cliente GWT?
- 24. Descargar archivo - VB6
- 25. Griales descargar el archivo
- 26. Descargar un archivo usando curl desde un servidor php
- 27. grails descargar archivo
- 28. FtpWebRequest Descargar archivo
- 29. ¿Cómo descargar un archivo de SFTP usando PHP?
- 30. Descargar archivo único
que querían votar a su pregunta, pero su respuesta me hizo para no hacerlo. –