Guardar archivo desde URL con C#

Para guardar un archivo desde una URL en C#, cree un HTMLDocument vacío, construya un RequestMessage para la URL de destino, envíelo con document.Context.Network.Send(request), compruebe el estado de la respuesta y escriba los bytes de respuesta en un archivo local.

Este artículo muestra un ejemplo de C# que puede usar para guardar un archivo desde una URL. Al descargar un archivo desde una URL, puede acceder, compartir, guardar y usar el archivo de la web para distintos fines según sus necesidades.

Hay varias razones por las que puede querer guardar archivos:

Guardar un archivo desde URL en C#

Para guardar un archivo desde una URL, necesita conocer su URL y contar con un controlador de operaciones de red adecuado para su protocolo. Aspose.HTML for .NET ofrece funcionalidad práctica para procesar URL con distintos tipos de protocolos. Para usarla, cree un documento HTML vacío y llame al controlador de solicitudes de red, como se muestra en el siguiente ejemplo de C#.

Para guardar un archivo desde URL en C#:

  1. Use el constructor HTMLDocument() para crear un documento en blanco.
  2. Cree una URL con la ruta al recurso que desea guardar.
  3. Use el constructor RequestMessage(url) para crear una nueva instancia de RequestMessage que representa un mensaje de solicitud HTTP.
  4. Use el método Context.Network.Send(request) para enviar la solicitud.
  5. Compruebe si la respuesta fue correcta antes de leer el contenido.
  6. Si la respuesta fue correcta, use File.WriteAllBytes() para guardar el archivo descargado en el sistema de archivos local.

Veamos cómo guardar un archivo desde una URL usando la biblioteca C# Aspose.HTML:

 1// Download file from URL using C#
 2
 3// Create a blank document; it is required to access the network operations functionality
 4using HTMLDocument document = new HTMLDocument();
 5
 6// Create a URL with the path to the resource you want to download
 7Url url = new Url("https://docs.aspose.com/html/images/handlers/message-handlers.png");
 8
 9// Create a file request message
10using RequestMessage request = new RequestMessage(url);
11
12// Download file from URL
13using ResponseMessage response = document.Context.Network.Send(request);
14
15// Check whether response is successful
16if (response.IsSuccess)
17{
18    // Save file to a local file system
19    File.WriteAllBytes(Path.Combine(OutputDir, url.Pathname.Split('/').Last()), response.Content.ReadAsByteArray());
20}

Errores comunes y soluciones

ProblemaCausaSolución
El archivo descargado está vacíoEl cuerpo de la respuesta se lee sin comprobar el estado de la respuestaCompruebe siempre si la respuesta fue correcta antes de leer el contenido
Error 404 con una URL aparentemente válidaLa URL contiene espacios sin codificar, caracteres especiales o una ruta relativa resuelta de forma incorrectaCodifique partes de la URL cuando sea necesario y use la URL base de la página al resolver enlaces relativos
OutOfMemoryException con archivos grandesToda la respuesta se carga en memoria como un arreglo de bytesTransmita la respuesta y cópiela por bloques usando un búfer
El archivo guardado tiene la extensión incorrectaLa ruta de la URL o una redirección no coincide con el tipo de contenido realCompruebe encabezados de respuesta y elija intencionalmente el nombre o la extensión del archivo local
La solicitud falla en un servidor o contenedorEl acceso de red, proxy, certificados o URL permitidas están restringidosVerifique permisos de red, configuración de proxy y certificados CA en el entorno de ejecución

FAQ

¿Puedo descargar archivos usando HTTP POST?

Sí. Establezca request.Method = HttpMethod.Post y añada contenido con request.Content = new StringContent(...) antes de enviar la solicitud.

¿Cómo añado encabezados personalizados, como claves API?

Use request.Headers.Add("Header-Name", "value") antes de enviar la solicitud.

¿Aspose.HTML admite descargas FTP?

La capa de red integrada está pensada para flujos HTTP y HTTPS. FTP requiere una implementación de red personalizada fuera del ejemplo estándar mostrado en esta página.

¿Puedo usar este enfoque para archivos grandes?

Para archivos grandes, evite cargar toda la respuesta en memoria. Transmita el contenido de la respuesta y cópielo a un archivo por bloques.

Otras plataformas

Artículos relacionados sobre extracción de datos

Puede descargar archivos desde URL usando ejemplos completos de C# del repositorio GitHub de Aspose.HTML for .NET.