Puis-je créer un contrôleur qui renvoie simplement un élément d'image?
Je voudrais acheminer cette logique via un contrôleur, chaque fois qu'une URL telle que la suivante est demandée:
www.mywebsite.com/resource/image/topbanner
Le contrôleur recherchera topbanner.png
et renverra cette image directement au client.
J'ai vu des exemples de cela où vous devez créer une vue - je ne veux pas utiliser une vue. Je veux tout faire avec juste le contrôleur.
Est-ce possible?
asp.net
asp.net-mvc
image
controller
Jonathan
la source
la source
ApiController class
Réponses:
Utilisez la méthode File des contrôleurs de base.
Comme note, cela semble être assez efficace. J'ai fait un test où j'ai demandé l'image via le contrôleur (
http://localhost/MyController/Image/MyImage
) et via l'URL directe (http://localhost/Images/MyImage.jpg
) et les résultats étaient:Remarque: il s'agit de la durée moyenne d'une demande. La moyenne a été calculée en effectuant des milliers de demandes sur la machine locale, de sorte que les totaux ne doivent pas inclure les problèmes de latence du réseau ou de bande passante.
la source
App_Data
qui devraient être signées par certains utilisateurs de votre application mais pas par d'autres. L'utilisation d'une action de contrôleur pour les servir vous permet de restreindre l'accès./../../../danger/someFileTheyTHoughtWasInaccessible
En utilisant la version finale de MVC, voici ce que je fais:
J'ai évidemment des informations spécifiques à l'application ici concernant la construction du chemin, mais le retour de FileStreamResult est agréable et simple.
J'ai fait des tests de performances en ce qui concerne cette action contre votre appel quotidien à l'image (en contournant le contrôleur) et la différence entre les moyennes n'était que d'environ 3 millisecondes (la moyenne du contrôleur était de 68 ms, celle du non-contrôleur était de 65 ms).
J'avais essayé certaines des autres méthodes mentionnées dans les réponses ici et les performances ont été beaucoup plus spectaculaires ... plusieurs des réponses des solutions étaient jusqu'à 6 fois supérieures au non-contrôleur (autres contrôleurs moy. 340 ms, non-contrôleur 65 ms).
la source
Path.Combine
place de concat pour un code plus sûr et plus lisible.Pour expliquer légèrement la réponse de Dyland:
Trois classes implémentent la classe FileResult :
Ils sont tous assez explicites:
FilePathResult
- c'est le moyen le plus simple et vous évite d'avoir à utiliser Streams.FileContentResult
.FileStreamResult
de la même manière que ci-dessous, mais avec unMemoryStream
et en utilisantGetBuffer()
.Streams
utilisationFileStreamResult
. Cela s'appelle un FileStreamResult mais cela prend unStream
donc je suppose que cela fonctionne avec unMemoryStream
.Voici un exemple d'utilisation de la technique de disposition de contenu (non testée):
la source
Cela peut être utile si vous souhaitez modifier l'image avant de la renvoyer:
la source
Vous pouvez créer votre propre extension et procéder de cette façon.
la source
Vous pouvez écrire directement dans la réponse mais elle n'est pas testable. Il est préférable de renvoyer un ActionResult dont l'exécution a été différée. Voici mon StreamResult réutilisable:
la source
Pourquoi ne pas aller simple et utiliser l'
~
opérateur tilde ?la source
MISE À JOUR: Il y a de meilleures options que ma réponse d'origine. Cela fonctionne assez bien en dehors de MVC mais il est préférable de s'en tenir aux méthodes intégrées de retour du contenu de l'image. Voir les réponses votées.
Vous le pouvez certainement. Essayez ces étapes:
Voici un exemple de code:
J'espère que cela pourra aider!
la source
Solution 1: pour rendre une image dans une vue à partir d'une URL d'image
Vous pouvez créer votre propre méthode d'extension:
Ensuite, utilisez-le comme:
Solution 2: pour rendre l'image à partir de la base de données
Créer une méthode de contrôleur qui renvoie les données d'image comme ci-dessous
Et utilisez-le dans une vue comme:
Pour utiliser une image rendue à partir de ce résultat d'action dans n'importe quel code HTML, utilisez
la source
Cela a fonctionné pour moi. Depuis que je stocke des images sur une base de données SQL Server.
Dans l'extrait ci
_db.ImageFiles.Find(uuid)
- dessus, vous recherchez l'enregistrement du fichier image dans la base de données (contexte EF). Il renvoie un objet FileImage qui n'est qu'une classe personnalisée que j'ai créée pour le modèle, puis l'utilise comme FileContentResult.la source
vous pouvez utiliser File pour renvoyer un fichier comme View, Content etc.
la source
Regardez ContentResult. Cela renvoie une chaîne, mais peut être utilisé pour créer votre propre classe de type BinaryResult.
la source
SomeHelper.EmptyImageResult()
devrait revenirFileResult
avec l'image existante (1x1 transparent, par exemple).C'est le moyen le plus simple si vous avez des fichiers stockés sur le disque local. Si les fichiers sont
byte[]
oustream
- alors utilisezFileContentResult
ouFileStreamResult
comme Dylan l'a suggéré.la source
Je vois deux options:
1) Implémentez votre propre IViewEngine et définissez la propriété ViewEngine du contrôleur que vous utilisez sur votre ImageViewEngine dans la méthode "image" souhaitée.
2) Utilisez une vue :-). Modifiez simplement le type de contenu, etc.
la source
Vous pouvez utiliser HttpContext.Response et y écrire directement le contenu (WriteFile () peut fonctionner pour vous), puis renvoyer ContentResult de votre action au lieu d'ActionResult.
Avis de non-responsabilité: je n'ai pas essayé cela, il est basé sur la recherche des API disponibles. :-)
la source
Le code ci-dessous utilise
System.Drawing.Bitmap
pour charger l'image.la source
J'ai également rencontré des exigences similaires,
Donc, dans mon cas, je fais une demande au contrôleur avec le chemin du dossier d'image, qui en retour renvoie un objet ImageResult.
L'extrait de code suivant illustre le travail:
Et dans le contrôleur à partir du chemin de l'image, je produis l'image et la renvoie à l'appelant
la source
Lisez l'image, convertissez-la en
byte[]
, puis retournez unFile()
avec un type de contenu.Voici les utilisations:
la source