2010-11-10 5 views
9

Nous avons quelques images dans notre base de données et que vous souhaitez afficher leur en vue. Je trouve deux voies de le faire - la première: nous créons une méthode d'action dans le contrôleur qui obtiennent une image de base de données et de retour FileContentResult:ASP.NET MVC: chargement des images de la base de données et affichage de leur vue

public ActionResult GetImage(int id) 
    { 
     var imageData = ...get bytes from database... 

     return File(imageData, "image/jpg"); 
    } 
Code

en vue:

<img src='<%= Url.Action("GetImage", "image", new { id = ViewData["imageID"] }) %>' /> 

La deuxième façon est d'utiliser HttpHandler:

public void ProcessRequest(HttpContext Context) 
    { 
     byte [] b = your image...; 
     Context.Response.ContentType = "image/jpeg"; 
     Context.Response.BinaryWrite(b); 
    } 

et code en mode:

<img src="AlbumArt.ashx?imageId=1" /> 

La première question est ce qui est le (travail plus rapide) la plus efficace façon de mettre en œuvre cette fonctionnalité (et pourquoi travailler plus vite)?
Et la deuxième question - est-il un moyen de mettre directement l'image dans notre vue, lorsque nous appelons d'abord la méthode d'action pour retourner cette vue? Je veux dire que dans la méthode d'action que nous obtenons liste des images de base de données et transmettre leur liste en vue que, et compte tenu utilisation de ce code:

<%=Html.Image(Model[i])%> 

ce code doit mettre l'image en vue directement à partir du modèle.

+0

Considérez-vous de mettre des fichiers d'images en dehors de la base de données? –

+0

Oui, j'ai placé la plupart des images dans le système de fichiers, mais j'étais intéressé par la solution décrite ci-dessus. – Kai

Répondre

6

Il n'y aura pas beaucoup de différence de performance entre les deux méthodes. Évidemment, l'utilisation d'un gestionnaire http sera la plus rapide car la requête ne passe pas par le cycle de vie MVC (routage, instanciation d'un contrôleur, liaison de modèle, invocation de l'action) mais je pense qu'il s'agit d'une micro optimisation. la première approche car elle est plus adaptée dans un scénario MVC. Si vous réalisez par la suite qu'il s'agit d'un goulot d'étranglement pour votre application en effectuant des tests de charge complets, vous pouvez toujours passer à l'approche du gestionnaire http.

En ce qui concerne votre deuxième question concernant l'assistant, la réponse est non, vous ne pouvez pas le faire facilement. La seule possibilité est d'utiliser le data URI scheme mais cela n'est pas supporté par tous les navigateurs. De cette façon, si votre modèle a le tableau d'octets de l'image que vous pouvez écrire un assistant qui rend les éléments suivants:

<img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAA..." alt="Red dot" /> 

Les données d'image est base64 directement dans la page. Un autre inconvénient est que ces images ne seront jamais mises en cache et vos pages HTML pourraient devenir très volumineuses.

Questions connexes