2009-08-29 8 views
0

Ich arbeite an einer einfachen Bild-Tagging-und Such-App. Ich habe meine Bilder hochgeladen in die DB, die Tags werden angewendet, aber scheitern, wenn ich sie zurückziehe - die Bilder werden nicht gerendert.Verwenden eines Handlers zum Rendern eines Bilds aus einem Blob auf einer ASP.NET-Seite. Ich kann es nicht bekommen

Ich fand this hier auf SO, aber ich bin nicht in der Lage, es zum Funktionieren zu bringen.

Ich denke, ich missverstanden vielleicht Handler.

Kurz gesagt, ich erstelle ein ASP: Image, indem ich seine imageurl auf den Handler mit der ID des Fotos setze und dieses Steuerelement dann einem ASP: Placeholder hinzufüge.

Wenn die Seite rendert, bekomme ich, in IE, das kleine rote x keine Bildsache, und in FF nichts.

Eine Sache, die mich denken lässt, dass ich etwas vermisse, ist, dass ein Breakpoint in meinem Handler-Code nie getroffen wird. Es wird also sogar ausgeführt. Recht?

Wer weiß, was ich hier falsch mache? Vielen Dank.

Hier ist mein Handler

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 

und wo ich es in meinem Platzhalter

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 

Antwort

1

C# Beispiel, aber das funktioniert gut für mich - Sie könnten den Inhalt Length-Header hinzufügen möchten:

<%@ 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; 
     } 
    } 

} 

Grundsätzlich tun nur einen einfachen Test zuerst Wenn das funktioniert, würde ich vorschlagen, dass es sich um die Daten handelt, die Sie aus der Datenbank zurückgeben.

+0

Ga! Ich bin ein totaler Nubcaeks (Entschuldigung, der Satz macht mich kaputt). Ich schrieb nichts in die DB - in meinem Upload habe ich nur die Größe des Bytes() eingestellt und es leer hochgeladen. Danke, Mann! – aape

1

Es bin kleben sieht aus wie Sie nicht den Handler in web.config und/oder die Erweiterung hat registrieren in IIS. Weitere Informationen finden Sie unter here und here.

EDIT: Ich sehe jetzt, dass Sie .ash als Erweiterung verwenden, so dass Sie es normalerweise nicht registrieren müssen. Der wichtigste Hinweis ist nun die Handler-Registrierung in web.config.

+0

Also für IIS7 im integrierten Modus, muss ich hinzufügen, meine web.config? resource = "Keine Angabe" /> aape

+0

Sorry wegen der Formatierung. – aape

+0

Nur hinzugefügt, und nachdem ich meine fehlenden schließenden Tags behoben habe, wird es immer noch nicht geladen. Ich habe es auf der Live-Site gemacht, da ich zu Hause bin und keine Entwicklungsbox habe, mit der ich mich herumschlagen könnte. – aape

0

Neugierig: Verwenden Sie BLOBs, um Hot-Linking zu vermeiden? (Es gibt viel bessere Möglichkeiten, dies zu tun)

+0

Nein, aber das beantwortet eine andere Frage, die in meinem Kopf herumspringt. Ich mache es nur, um es zu tun. Ich habe endlich [eine Domain] (http://www.asocialindustries.com) und kann damit einfach Dinge ausprobieren und neue Sachen lernen - bei der Arbeit mache ich immer ihre Sachen, und es ist alles Intranet trotzdem, ich werde es nie für ein Portfolio oder irgendetwas verwenden können. – aape

Verwandte Themen