Existe uma maneira de baixar uma imagem diretamente de um url em c # se o url não tiver um formato de imagem no final do link? Exemplo 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
Eu sei como baixar a imagem quando o url termina com um formato de imagem. Por exemplo:
http://img1.wikia.nocookie.net/__cb20101219155130/uncyclopedia/images/7/70/Facebooklogin.png
Dependendo se você conhece ou não o formato da imagem, aqui estão algumas maneiras de fazer isso:
Baixar imagem para um arquivo, conhecendo o formato da imagem
Baixe a imagem para um arquivo sem saber o formato da imagem
Você pode usar
Image.FromStream
para carregar qualquer tipo de bitmaps usuais (jpg, png, bmp, gif, ...), ele irá detectar automaticamente o tipo de arquivo e você nem precisa verificar a extensão do url (o que não é muito bom prática). Por exemplo:Nota: ArgumentException pode ser lançada por
Image.FromStream
se o conteúdo baixado não for um tipo de imagem conhecido.Verifique esta referência no MSDN para encontrar todos os formatos disponíveis. Aqui estão referências a
WebClient
eBitmap
.fonte
webClient.ResponseHeaders["Content-Type"]
Para quem deseja baixar uma imagem SEM salvá-la em um arquivo:
fonte
Não é necessário usar
System.Drawing
para localizar o formato da imagem em um URI.System.Drawing
não está disponível para a.NET Core
menos que você baixe o pacote System.Drawing.Common NuGet e, portanto, não vejo nenhuma boa resposta entre plataformas para essa pergunta.Além disso, meu exemplo não usa,
System.Net.WebClient
pois a Microsoft desestimula explicitamente o uso deSystem.Net.WebClient
.Baixe uma imagem e grave-a em um arquivo sem saber a extensão (plataforma cruzada) *
* Sem
System.Net.WebClient
e velhoSystem.Drawing
.Este método irá baixar de forma assíncrona uma imagem (ou qualquer arquivo, desde que o URI tenha uma extensão de arquivo) usando o
System.Net.Http.HttpClient
e, em seguida, gravá-lo em um arquivo, usando a mesma extensão de arquivo que a imagem tinha no URI.Obtendo a extensão do arquivo
A primeira parte para obter a extensão do arquivo é remover todas as partes desnecessárias do URI.
Usamos Uri.GetLeftPart () com UriPartial.Path para obter tudo, desde o
Scheme
até oPath
.Em outras palavras,
https://www.example.com/image.png?query&with.dots
torna-sehttps://www.example.com/image.png
.Depois disso, usamos Path.GetExtension () para obter apenas a extensão (em meu exemplo anterior,
.png
).Baixando a imagem
A partir daqui, deve ser direto. Baixe a imagem com HttpClient.GetByteArrayAsync , crie o caminho, verifique se o diretório existe e, em seguida, grave os bytes no caminho com File.WriteAllBytesAsync () (ou
File.WriteAllBytes
se você estiver no .NET Framework)Observe que você precisa do seguinte usando diretivas.
Exemplo de uso
Notas
HttpClient
para cada chamada de método. Deve ser reutilizado em todo o aplicativo. Escrevi um pequeno exemplo de umImageDownloader
(50 linhas) com mais documentação que reutiliza corretamenteHttpClient
e elimina corretamente o que você pode encontrar aqui .fonte
.net Framework permite PictureBox Control carregar imagens de url
e salvar a imagem no evento completo Laod
fonte
Experimente isto funcionou para mim
Escreva isso em seu controlador
Aqui está minha visão
fonte
A maioria das postagens que encontrei atingirá o tempo limite após uma segunda iteração. Particularmente se você estiver percorrendo um monte de imagens como eu. Portanto, para melhorar as sugestões acima, aqui está o método completo:
fonte