J'ai quelques images dans une base de données SQL Server. Je veux les afficher quand un utilisateur clique sur un bouton, mais je veux qu'ils se chargent dans le navigateur en tant que fichier de sorte que lorsque l'utilisateur redimensionne la fenêtre, les images se redimensionnent automatiquement. Par exemple, dans Firefox, si vous allez dans Fichier-> Ouvrir fichier ... et sélectionnez une image sur votre ordinateur, il la chargera dans une nouvelle fenêtre et la redimensionnera pour vous lorsque vous faites glisser les barres de défilement. Mon problème est, comment puis-je obtenir l'image à charger à partir d'une base de données SQL Server dans le navigateur en tant que fichier? Je le code suivant sur le formulaire où l'utilisateur clique voir dans un GridView:Comment charger une image dans ASP.NET à partir d'une base de données en tant que fichier dans un navigateur Web?
<script type="text/javascript">
function ShowImageInNewPage(url_add) {
window.open(url_add, 'ViewScreenshot', 'resizable=yes,scrollbars = yes');
}
</script>
<asp:GridView
ID="grdTrades"
runat="server"
<... removed some properties for brevity ...>
>
<Columns>
<asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" />
<.. removed some columns for brevity ...>
<asp:TemplateField HeaderText="Screenshot" >
<ItemTemplate>
<input type="button" size="x-small" value="View" onclick="javascript:ShowImageInNewPage('DisplayImage.aspx?screenshotId=<%# Eval("screenshotId") %>');" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
DisplayImage.aspx a ce code:
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["screenshotId"] != null)
{
int screenshotId= int.Parse(Request.QueryString["screenshotId"]);
imgScreenshot.ImageUrl = "App_Handlers/ImageHandler.ashx?screenshotId=" + screenshotId;
}
}
</script>
<html>
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Image ID="imgScreenshot" runat="server" />
</div>
</form>
</body>
</html>
App_Handlers/ImageHandler.ashx a ce code:
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System;
using System.Web;
using System.Data;
using DatabaseComponent;
public class ImageHandler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
if (context.Request.QueryString["screenshotId"] != null)
{
int screenshotId = int.Parse(context.Request.QueryString["screenshotId"]);
DBUtil DB = new DBUtil();
DataTable dt = DB.GetScreenshot(screenshotId);
if (dt != null)
{
Byte[] bytes = (Byte[])dt.Rows[0]["screenshot"];
context.Response.Buffer = true;
context.Response.Charset = "";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.ContentType = dt.Rows[0]["contentType"].ToString();
context.Response.AddHeader("content-disposition", "attachment;filename=" + dt.Rows[0]["fileName"].ToString());
context.Response.BinaryWrite(bytes);
context.Response.Flush();
context.Response.End();
}
}
}
public bool IsReusable {
get {
return false;
}
}
}
Voici les en-têtes de réponse pour DisplayImage.aspx
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 10 Nov 2010 13:13:37 GMT
X-AspNet-Version: 4.0.30319
Transfer-Encoding: chunked
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: image/JPG
Connection: Close
J'ai modifié ma question initiale pour utiliser un gestionnaire d'image maintenant grâce à @leppie. Merci d'avoir regardé!
MISE À JOUR
J'ai maintenant changé DisplayImage.aspx à ce code, mais maintenant je reçois un comportement bizarre réel. Lorsque je clique sur un lien d'image, cette page se charge et Firefox demande si je veux enregistrer DisplayImage.aspx. Que se passe-t-il? Comment puis-je obtenir Firefox pour charger l'image en tant que fichier?
DisplayImage.aspx:
<%@ Page Language="C#" ContentType="image/*" %>
<script runat="server">
</script>
<html>
<head runat="server">
<title></title>
</head>
<body>
<img src="App_Handlers/ImageHandler.ashx?screenshotId=<%=Request.QueryString["screenshotId"]%>" />
</body>
</html>
Si je retire ContentType de la page déclaration des charges d'image dans une nouvelle fenêtre mais l'image ne sera pas zoomer, et ne se redimensionner. Retirer mes cheveux ...
Oui, vous avez besoin de 2. – leppie
Il semble que personne ne sait comment charger une image à partir d'une base de données et la charger dans le navigateur en tant que fichier. Cela doit être un modèle commun, quelqu'un veut-il faire un autre essai? :-) –
vous devez modifier l'en-tête de disposition de contenu à en ligne et inclure l'en-tête de longueur de contenu ainsi –