Posso criar um controlador que simplesmente retorna um ativo de imagem?
Gostaria de rotear essa lógica por meio de um controlador, sempre que uma URL como a seguinte for solicitada:
www.mywebsite.com/resource/image/topbanner
O controlador procurará topbanner.png
e enviará a imagem diretamente de volta para o cliente.
Eu já vi exemplos disso em que você precisa criar uma View - não quero usar uma View. Eu quero fazer tudo com apenas o controlador.
Isso é possível?
asp.net
asp.net-mvc
image
controller
Jonathan
fonte
fonte
ApiController class
Respostas:
Use o método de arquivo dos controladores base.
Como uma nota, isso parece ser bastante eficiente. Fiz um teste em que solicitei a imagem através do controller (
http://localhost/MyController/Image/MyImage
) e através da URL direta (http://localhost/Images/MyImage.jpg
) e os resultados foram:Nota: este é o tempo médio de uma solicitação. A média foi calculada fazendo milhares de solicitações na máquina local; portanto, os totais não devem incluir problemas de latência ou largura de banda da rede.
fonte
App_Data
que devem ser assinadas por alguns usuários do seu aplicativo, mas não por outros. O uso de uma ação do controlador para atendê-los permite restringir o acesso./../../../danger/someFileTheyTHoughtWasInaccessible
Usando a versão do MVC, aqui está o que eu faço:
Obviamente, tenho algumas coisas específicas de aplicativos aqui relacionadas à construção do caminho, mas o retorno do FileStreamResult é agradável e simples.
Fiz alguns testes de desempenho em relação a essa ação em relação à sua chamada diária para a imagem (ignorando o controlador) e a diferença entre as médias foi de apenas cerca de 3 milissegundos (o valor médio do controlador foi de 68ms e o não-controlador foi de 65ms).
Eu tentei alguns dos outros métodos mencionados nas respostas aqui e o desempenho foi muito mais dramático ... várias das respostas das soluções chegaram a 6x o não-controlador (outros controladores avg 340ms, non-controller 65ms).
fonte
Path.Combine
vez da concat para obter um código mais seguro e legível.Para explorar um pouco a resposta de Dyland:
Três classes implementam a classe FileResult :
Eles são todos bastante auto-explicativos:
FilePathResult
- esta é a maneira mais fácil e evita que você precise usar o Streams.FileContentResult
.FileStreamResult
maneira semelhante à abaixo, mas com aMemoryStream
e usandoGetBuffer()
.Streams
usoFileStreamResult
. É chamado de FileStreamResult, mas é preciso um,Stream
então eu acho que funciona com umMemoryStream
.Abaixo está um exemplo de uso da técnica de disposição de conteúdo (não testada):
fonte
Isso pode ser útil se você quiser modificar a imagem antes de devolvê-la:
fonte
Você pode criar sua própria extensão e fazer isso dessa maneira.
fonte
Você pode escrever diretamente na resposta, mas não pode ser testado. É preferível retornar um ActionResult que adiou a execução. Aqui está o meu StreamResult reutilizável:
fonte
Por que não simplificar e usar o
~
operador til ?fonte
ATUALIZAÇÃO: Existem opções melhores do que minha resposta original. Isso funciona muito bem fora do MVC, mas é melhor seguir os métodos internos de retorno do conteúdo da imagem. Veja as respostas votadas.
Você certamente pode. Experimente estes passos:
Aqui está um exemplo de código:
Espero que ajude!
fonte
Solução 1: para renderizar uma imagem em uma exibição a partir de um URL da imagem
Você pode criar seu próprio método de extensão:
Em seguida, use-o como:
Solução 2: para renderizar imagem do banco de dados
Crie um método de controlador que retorne dados de imagem como abaixo
E use-o em uma exibição como:
Para usar uma imagem renderizada a partir desta ação em qualquer HTML, use
fonte
Isso funcionou para mim. Desde que eu estou armazenando imagens em um banco de dados do SQL Server.
No trecho acima,
_db.ImageFiles.Find(uuid)
procure o registro do arquivo de imagem no banco de dados (contexto EF). Ele retorna um objeto FileImage, que é apenas uma classe personalizada que fiz para o modelo e, em seguida, o usa como FileContentResult.fonte
você pode usar o arquivo para retornar um arquivo como exibição, conteúdo etc
fonte
Veja o ContentResult. Isso retorna uma string, mas pode ser usado para criar sua própria classe do tipo BinaryResult.
fonte
SomeHelper.EmptyImageResult()
deve retornarFileResult
com a imagem existente (1x1 transparente, por exemplo).Essa é a maneira mais fácil se você tiver arquivos armazenados na unidade local. Se os arquivos forem
byte[]
oustream
- useFileContentResult
ouFileStreamResult
como sugerido por Dylan.fonte
Eu vejo duas opções:
1) Implemente seu próprio IViewEngine e defina a propriedade ViewEngine do Controller que você está usando para o ImageViewEngine no método "image" desejado.
2) Use uma visão :-). Basta alterar o tipo de conteúdo etc.
fonte
Você pode usar o HttpContext.Response e gravar diretamente o conteúdo nele (WriteFile () pode funcionar para você) e, em seguida, retornar ContentResult de sua ação em vez de ActionResult.
Isenção de responsabilidade: eu não tentei isso, é baseado nas APIs disponíveis. :-)
fonte
O código abaixo utiliza
System.Drawing.Bitmap
para carregar a imagem.fonte
Eu também encontrei um requisito semelhante,
Portanto, no meu caso, faço uma solicitação ao Controller com o caminho da pasta de imagens, que em troca envia um objeto ImageResult.
O trecho de código a seguir ilustra o trabalho:
E no Controller do caminho da imagem eu produzo a imagem e a devolvo ao chamador
fonte
Leia a imagem, converta-a em
byte[]
e retorne aFile()
com um tipo de conteúdo.Aqui estão os usos:
fonte