¿Hay alguna manera de descargar una imagen directamente desde una URL en c # si la URL no tiene un formato de imagen al final del enlace? Ejemplo de URL:
https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t34.0-12/10555140_10201501435212873_1318258071_n.jpg?oh=97ebc03895b7acee9aebbde7d6b002bf&oe=53C9ABB0&__gda__=1405685729_110e04e71d969d392b63b27ec4f4b24a
Sé cómo descargar la imagen cuando la URL termina con un formato de imagen. P.ej:
http://img1.wikia.nocookie.net/__cb20101219155130/uncyclopedia/images/7/70/Facebooklogin.png
Dependiendo de si conoce o no el formato de la imagen, aquí hay formas de hacerlo:
Descargar imagen a un archivo, conociendo el formato de imagen
Descargar la imagen a un archivo sin conocer el formato de la imagen
Puede usar
Image.FromStream
para cargar cualquier tipo de mapa de bits habitual (jpg, png, bmp, gif, ...), detectará automáticamente el tipo de archivo y ni siquiera necesita verificar la extensión de la URL (que no es muy buena práctica). P.ej:Nota: ArgumentException puede aparecer
Image.FromStream
si el contenido descargado no es un tipo de imagen conocido.Consulte esta referencia en MSDN para encontrar todos los formatos disponibles. Aquí se hace referencia a
WebClient
yBitmap
.fuente
webClient.ResponseHeaders["Content-Type"]
Para cualquiera que quiera descargar una imagen SIN guardarla en un archivo:
fuente
No es necesario utilizar
System.Drawing
para buscar el formato de imagen en un URI.System.Drawing
no está disponible a.NET Core
menos que descargue el paquete System.Drawing.Common NuGet y, por lo tanto, no veo ninguna buena respuesta multiplataforma a esta pregunta.Además, mi ejemplo no se usa
System.Net.WebClient
ya que Microsoft desalienta explícitamente el uso deSystem.Net.WebClient
.Descarga una imagen y escríbela en un archivo sin conocer la extensión (multiplataforma) *
* Sin edad
System.Net.WebClient
ySystem.Drawing
.Este método descargará de forma asincrónica una imagen (o cualquier archivo siempre que el URI tenga una extensión de archivo) usando el
System.Net.Http.HttpClient
y luego lo escribirá en un archivo, usando la misma extensión de archivo que tenía la imagen en el URI.Obtener la extensión del archivo
La primera parte para obtener la extensión del archivo es eliminar todas las partes innecesarias del URI.
Usamos Uri.GetLeftPart () con UriPartial.Path para obtener todo, desde el
Scheme
hasta elPath
.En otras palabras, se
https://www.example.com/image.png?query&with.dots
convierte enhttps://www.example.com/image.png
.Después de eso, usamos Path.GetExtension () para obtener solo la extensión (en mi ejemplo anterior,
.png
).Descargando la imagen
A partir de aquí debería ser sencillo. Descargue la imagen con HttpClient.GetByteArrayAsync , cree la ruta, asegúrese de que el directorio exista y luego escriba los bytes en la ruta con File.WriteAllBytesAsync () (o
File.WriteAllBytes
si está en .NET Framework)Tenga en cuenta que necesita las siguientes directivas using.
Uso de ejemplo
Notas
HttpClient
para cada llamada de método. Se supone que debe reutilizarse en toda la aplicación. Escribí un breve ejemplo de unImageDownloader
(50 líneas) con más documentación que reutiliza correctamenteHttpClient
y lo desecha correctamente que puede encontrar aquí .fuente
.net Framework permite PictureBox Control cargar imágenes desde la URL
y guardar imagen en evento completo de Laod
fuente
Prueba esto, funcionó para mí
Escribe esto en tu controlador
Esta es mi vista
fuente
La mayoría de las publicaciones que encontré expirarán después de una segunda iteración. Particularmente si estás recorriendo un montón de imágenes como yo. Entonces, para mejorar las sugerencias anteriores, aquí está el método completo:
fuente