Использование обработчика для визуализации изображения из BLOB-объекта на странице ASP.NET. Я не могу получить это - PullRequest
0 голосов
/ 29 августа 2009

Я работаю над простым приложением для тегов и поиска изображений. Я загружаю свои изображения в БД, применяя теги, но у меня не получается, когда я возвращаю их назад - изображения не отображаются.

Я нашел это здесь на SO, но я не могу заставить его работать.

Я думаю, что, возможно, я неправильно понимаю обработчиков.

Короче говоря, в коде позади я создаю ASP: изображение, устанавливаю его imageurl в обработчик с идентификатором фотографии, а затем добавляю этот элемент управления в ASP: Placeholder.

Когда страница отображается, я получаю в IE тот маленький красный х без изображения, а в FF - ничего.

Одна вещь, которая заставляет меня думать, что я что-то упускаю, это то, что точка останова в моем коде обработчика никогда не достигается. Так что это даже выполняется. Правильно?

Кто-нибудь знает, что я здесь не так делаю? Спасибо.

Вот мой обработчик

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

и где я втыкаю это в мой заполнитель

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

Ответы [ 3 ]

1 голос
/ 30 августа 2009

C # пример, но это прекрасно работает для меня - вы можете добавить заголовок длины контента:

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

}

По сути, сначала просто проведите простой тест, если это сработает, я бы посоветовал вам вернуть данные из базы данных.

1 голос
/ 29 августа 2009

Похоже, вы не зарегистрировали обработчик в web.config и / или расширение в IIS. См. здесь и здесь для получения более подробной информации.

РЕДАКТИРОВАТЬ: теперь я вижу, что вы используете .ashx в качестве расширения, поэтому вам обычно не нужно его регистрировать. Теперь основная подсказка - регистрация обработчика в web.config.

0 голосов
/ 29 августа 2009

Любопытно: вы используете BLOB, чтобы избежать горячей ссылки? (Есть намного лучшие способы сделать это)

...