L'utilisation d'un gestionnaire pour rendre une image à partir d'un blob sur une page ASP.NET. Je ne peux pas l'obtenir

StackOverflow https://stackoverflow.com/questions/1351396

Question

Je travaille sur un marquage d'image simple et l'application de la recherche. J'ai mes télécharger des images vers la DB, les étiquettes appliquées, mais je manquerais quand je les tire en arrière -. Les images ne rendent pas

Je trouve cette ici sur le SO, mais je ne suis pas en mesure de le faire fonctionner.

Je pense que je suis peut-être des gestionnaires malentendu.

En bref, dans le code derrière, je crée un ASP: Image, définissant son imageurl au gestionnaire avec l'identifiant de la photo, puis en ajoutant que le contrôle à un ASP. Placeholder

Lorsque la page rend, je reçois, dans IE, ce petit rouge x aucune chose d'image, et FF, rien.

Une chose qui me fait penser que je manque quelque chose est qu'un point d'arrêt dans mon code de gestionnaire n'est jamais touché. Donc, il est même CHAISE. Droit?

Quelqu'un sait ce que je fais mal ici? Merci.

Voici mon gestionnaire

Imports aapeClsLib
Imports System.Web
Imports System.Web.Services

Public Class photos
    Implements System.Web.IHttpHandler

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest

        Dim img As Byte() = getImage(context.Request.QueryString("ID"))
        context.Response.Clear()
        context.Response.ContentType = "image/jpeg"
        context.Response.BinaryWrite(img)
        context.Response.End()
    End Sub

    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
        Get
            Return False
        End Get
    End Property


    Private Function getImage(ByVal id As String) As Byte()
        Dim img As Byte()

        Dim strSql As String = "select ph_photo from photos where ph_id = " & id
        Dim dt As DataTable = sqLiteData.getDataTable(strSql)
        img = CType(dt.Rows(0)(0), Byte())

        Return img


    End Function
End Class

et où je suis coller dans mon espace réservé

Private Sub insertPhotos(ByVal dt As DataTable)
     For Each row As DataRow In dt.Rows

         Dim img As New Image
         img.ImageUrl = "photos.ashx?ID=" & row(0)
         PlaceHolder1.Controls.Add(img)

     Next
 End Sub
Était-ce utile?

La solution

C # exemple, mais cela fonctionne bien pour moi - vous pouvez ajouter l'en-tête de longueur du contenu:

<%@ WebHandler Language="C#" Class="Photo" %>

using System;
using System.Web;

public class Photo : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "image/jpeg";
        context.Response.BinaryWrite(System.IO.File.ReadAllBytes("C:\\Test.jpg"));
        context.Response.AddHeader("Content-Length", new System.IO.FileInfo("C:\\Test.jpg").Length.ToString());
    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}

En fait, faire juste un simple test d'abord, si cela fonctionne alors je vous suggère qu'il est les données que vous le retour de la base de données.

Autres conseils

Il semble que vous n'avez pas enregistré le gestionnaire dans web.config et / ou l'extension dans IIS. Voir et ici pour plus de détails.

EDIT: Je vois maintenant que vous utilisez .ashx comme l'extension, de sorte que vous ne sont généralement pas besoin de l'enregistrer. Maintenant, la moindre idée principale est l'enregistrement du gestionnaire dans web.config.

Curious: Utilisez-vous pour éviter-linking chaud de blob? (Il y a de bien meilleures façons de le faire)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top