Streaming byte[] à l'Image de ASP.NET C#
J'ai une Image stockées dans ma base de données SQL Server stockées mes données d'Utilisateur qui j'ai récupérer tous à la fois.
Maintenant, j'ai le byte[] directement sur la page que je veux afficher sur. Comment puis-je mettre dans mon contrôles webcontrols.De l'Image? Je ne veux pas faire appel à un HttpHandler et d'appeler la base de données à nouveau.
Évidemment, tout juste sorties de l'ensemble de la page.
Context.Response.BinaryWrite(user.Picture.ToArray());
Pouvez-vous ne pas stocker les données de l'image en tant que fichier?
C'était la première route, mais storeing l'image dans la base de données a été la solution privilégiée. (Au-dessus de ma tête) j'ai Donc de tirer le meilleur parti de la situation.
Merci à tous pour les aider tout le monde. Rapide et perspicace des réponses.
L'incorporation d'une image en base64 est un dernier recours. Même avec extra DB trafic, il est préférable d'utiliser des requêtes distinctes alors que la page est plus réactif. Il y a une bibliothèque qui le rend assez facile. Le SqlReader des fonctions de classe comme un VirtualPathProvider, qui vous donne de bien meilleures performances qu'un HttpHandler. Et vous pouvez les combiner avec les DiskCache plugin pour obtenir de très bonnes performances.
C'était la première route, mais storeing l'image dans la base de données a été la solution privilégiée. (Au-dessus de ma tête) j'ai Donc de tirer le meilleur parti de la situation.
Merci à tous pour les aider tout le monde. Rapide et perspicace des réponses.
L'incorporation d'une image en base64 est un dernier recours. Même avec extra DB trafic, il est préférable d'utiliser des requêtes distinctes alors que la page est plus réactif. Il y a une bibliothèque qui le rend assez facile. Le SqlReader des fonctions de classe comme un VirtualPathProvider, qui vous donne de bien meilleures performances qu'un HttpHandler. Et vous pouvez les combiner avec les DiskCache plugin pour obtenir de très bonnes performances.
OriginalL'auteur markoo | 2009-08-28
Vous devez vous connecter pour publier un commentaire.
Si c'est une petite image de sortie ce que les données encodées en base64 dans une image-tag.
Voir ici pour une situation similaire.
Mais dans 99,9% de toutes les situations, vous devez créer un HttpHandler qui renvoie l'image. C'est la méthode la plus simple et la plus rapide façon de le faire je pense.
Combien d'octets n'est qu'à la fin quand encodées en base64? En plaçant les données de l'image directement dans le dynmically HTML généré, vous avez besoin du client afin de le récupérer à chaque fois, il n'est pas mis en cache, sauf si vous avez l'intégralité du code html de réponse pouvant être mis en cache.
Mon image finit par être autour de 8 KO, qui, à mon simple utilisateur des données de point de vue est tout à fait acceptable. C'est un "interne" de l'admin du site au sein de mon entreprise. Bien que le composant sera utilisé à l'extérieur. Ces composants externes et les sites sont fortement mis en cache par notre admins. Donc je n'ai aucun soucis dans la mise en œuvre de cette solution. Ces profils sont très limitées. Seulement environ 20 ou 30, dans la maison des journalistes. Il semble donc exagéré pour avoir une image distincte de la table seulement pour ces. Merci encore pour votre perspicacité.
Vous devez être prudent que pas tous les navigateurs ne peuvent lire que beaucoup de données lorsqu'ils sont stockés en ligne. Assurez-vous de tester la page s'affiche correctement dans tous les navigateurs, vous soutenir.
Merci pour l'astuce. J'ai testé sous IE, FF, Chrome ce jour et il fonctionne très bien, même avec des images jusqu'à 400 KO
OriginalL'auteur Rune Grimstad
Envelopper le tableau d'octets dans un MemoryStream objet et le placer que dans ASP.Filets De Cache.
Ensuite utiliser un gestionnaire (.ashx) pour aller la chercher hors de la mémoire cache et l'envoyer au client.
Vous pouvez maintenant déposer la MemoryStream à partir du Cache.
Jamais, jamais, jamais faire cela. Vous êtes tout sacrifier la bonté de HTTP (
If-Modified-Since
, la mise en cache, etc) et d'évolutivité pour absolument aucun avantage.avez-vous vu la ligne de commentaire dans mon code? Ce que vous pensez que je veux dire par là?
au contraire de faire bon usage d'une batterie de serveurs web est exactement ce que l'utilisation du cache est bon pour. Dans un WLB de l'environnement de la session peut et le plus souvent affiliés à un serveur dans la batterie de serveurs. L'ensemble de la point d'avoir une Batterie de serveurs Web est de prendre la pression de la couche de base de données et la mise en cache est une partie très importante de la solution.
Le haut-ASP.NET cache, utilisé dans votre exemple de code, est pas distribuée: chaque serveur a son propre cache. Si votre demande d'image frappe un autre serveur alors les données de l'image ne sera pas trouvé dans son cache. (Évidemment, cela ne s'applique pas si votre webfarm utilise les sessions persistantes, mais qui a ses propres problèmes d'évolutivité.)
OriginalL'auteur AnthonyWJones
créer une page séparée, où vous pourrez vous créer une image par exemple: image.aspx
et de les utiliser sur d'autres pages
numéro de l'id de l'image dans la base de données
L'OP dit qu'ils ne veulent pas utiliser un
ashx
, même si je suis d'accord que c'est la bonne façon de le faire. (Et la création d'unaspx
n'est pas plus facile que de créer unashx
de toute façon!)Je ne sais pas la differnece. C'est seulement l'extension n'est-ce pas? Il peut même être number.jpg avec le routage.
Il ya une raison pourquoi MS décrit le fichier ASPX comme un ASP.NET Type. Il est livré avec une considérable des frais généraux associés à une forme complète du cycle de vie (intialiseing commandes, le chargement, la manutention post de retour, pré-rendu, le rendu, le déchargement, l'élimination bla bla). Aucun dont vous avez besoin si tout ce que vous allez faire est d'ajuster les propriétés de l'objet de la réponse et le dump d'un bloc de données dans la sortie. Dans ce cas .ashx est plus facile et plus propre solution.
La raison pour laquelle l'OP voulait éviter un gestionnaire est d'éviter d'avoir à lire l'image de la DB, encore une fois, je n'ai pas lu une aversion pour les gestionnaires proprement dit, juste éviter de dupliquer inutilement une importante opération.
OriginalL'auteur x2.
Vous avez besoin d'un
IHttpHander
qui va écrire des octets de l'image et de la bonneContent-Type
à un flux de réponse. Voir cette, cette et cette.<img
sur dans la sortie pour afficher l'image sans avoir à ré-interrogation de la bd??Certes, le fait est qu'il n'a pas besoin de tirer sur les données de l'image de la base de données sur la page elle-même. Il n'a pas besoin de requête de la base de données dont il a besoin pour de la requête une fois à l'endroit approprié/temps (c'est à dire, dans un autre
ashx
gestionnaire.)Que peut-être, mais nous ne savons pas que faisons-nous? Tout ce que nous avons de la question est que, pour une raison quelconque, il a un objet qui a déjà une Image chargée de l'objet. Peut-être que l'on peut éviter, mieux encore, placez l'image dans le système de fichiers. Je préfère répondre à la question à portée de main, surtout depuis que certains autres de SORTE que l'utilisateur peut trouver à un certain moment, ils sont dans cette situation pour des raisons inévitables.
C'était aussi la seule solution que j'ai trouvé sur Google, mais d'aucune utilité pour moi, comme j'ai déjà les données de la base de données une fois, et vous ne voulez pas perdre un autre appel.
OriginalL'auteur Anton Gogolev
Je suis sûr que vous ne pouvez pas le faire dans la page elle-même.
Si vous ne voulez pas créer un Gestionnaire HTTP à la sortie de l'image, puis votre alternative est de créer un
aspx
page. Définir lasrc
de votreimg
balise à point à cette page, en passant d'une pièce d'identité dans la chaîne de requête, de sorte que les données d'image peuvent être extraites de la base de données.Cela dit, la création d'un
aspx
page de le faire c'est pas plus rapide ou plus facile que d'installer unashx
. Je ne recommande pas de faire ce que le droit façon et la création d'un Gestionnaire HTTP.OriginalL'auteur LukeH