[ASPNET] Problem z wyświetlaniem danych binarnych z bazy

Mam zapisywane obrazy w bazie danych. Obrazy i miniaturki zapisują się poprawnie jednak problem jest z ich wyświetleniem gdyż obrazki w ogóle się nie wyświetlają:/

Tutaj wyświetlam obrazki z wykorzystaniem Handlera:

AddNotice.aspx:

...






...

VehicleImage.ashx:

...

public class VehicleImage : IHttpHandler 

{

    public void ProcessRequest(HttpContext context)

    {

        context.Response.ContentType = "image/pjpeg";

        context.Response.BufferOutput = false;

        context.Response.BinaryWrite(VehicleImagesManager.GetImage(

            Convert.ToInt32(context.Request.QueryString["imageid"]),

            Convert.ToInt32(context.Request.QueryString["thumbnail"]) == 1 ? false : true));

        context.Response.BinaryWrite(VehicleImagesManager.GetImage(14,false));

        context.Response.End();

    }

    public bool IsReusable

    { get { return false; }}

}

...

VehicleImagesManeger.cs:

... 

 public static byte[] GetImage(int imageId, bool fullImage)

    {

        using (SqlConnection connection = new SqlConnection(WebConfigurationManager.ConnectionStrings["biurosqlConnectionString"].ConnectionString))

        {

            using (SqlCommand command = connection.CreateCommand())

            {

                command.CommandType = CommandType.Text;

                command.CommandText = String.Format(

                    @"SELECT {0} FROM ZDJECIE WHERE Id = @ImageId",

                    fullImage ? "[Image]" : "Thumbnail");

                command.Parameters.Add("@ImageId", SqlDbType.Int).Value = imageId;

                connection.Open();

                return (byte[])command.ExecuteScalar();

            }


        }

    }

...

VehicleImage.aspx:

protected void Page_Load(object sender, EventArgs e)

    {

        this.imgVehicle.ImageUrl = String.Format("VehicleImage.ashx?thumbnail=0&;imageid={0}", this.Request.QueryString["imageid"]);

    }

Dodam jeszcze tylko że po wpisaniu w przeglądarce np.: http://localhost:56140/Nieruchomosci/VehicleImage.ashx?thumbnail=1&;imageid=10

obrazek się wyświetla…

Jak możesz to wrzuć jeszcze jak masz ten handler w web.config-u ustawiony.

A co do tych fragmentów kodu, które wrzuciłeś …

  1. W metodzie ProcessRequest masz

    context.Response.BinaryWrite(VehicleImagesManager.GetImage(

             Convert.ToInt32(context.Request.QueryString["imageid"]),
    
             Convert.ToInt32(context.Request.QueryString["thumbnail"]) == 1 ? false : true));
    
         context.Response.BinaryWrite(VehicleImagesManager.GetImage(14,false));
    

Ta metoda chyba powinna zwracać jeden obrazek? Po co tam jest to:

context.Response.BinaryWrite(VehicleImagesManager.GetImage(14,false));
  1. I może popraw jeszcze ten URL

    VehicleImage.ashx?thumbnail=1&;imageid=10

Wywal ten średnik, czyli ma być

VehicleImage.ashx?thumbnail=1&imageid=10
  1. W metodzie GetImage przydałoby się zamykać połączenie z bazą danych

Dzięki matzu :wink:

Zgadza się. Przez przypadek to tutaj wkleiłem, normalnie mam to w komentarzu mam gdyż próbowałem cokolwiek wyświetlić wstawiając wartości na “sztywno”;p Handler w webconfigu:

Szczerz mówiąc matzu nie rozumiem tego kodu w Web.config’u:/ Namieszane tutaj jest coś :confused:

Przecież jest zamykane.

I nie rozumiem, po co używać Convert.ToInt32 do parsowania stringa. Od tego jest int.Parse.

Co do tego zamykania to masz rację. Nie zauważyłem, że obiekt SqlConnection jest tak samo jak SqlCommand tworzony w obrębie klauzuli using.

Co do tego parsowania przy użyciu Convert.ToInt32 to już co kto lubi. Ta metoda przecież o ile się nie mylę wywołuje właśnie int.Parse.

A co do samego problemu … podmień tą sekcję w web.configu odpowiedzialną za handlery na takie coś:

i zobacz, czy zadziała.

Pojawia się komunikat:

Komunikat o błędzie analizatora składni: Nie można załadować typu ‘VehicleImage’.

O co w ogóle chodzi z tym ustawieniem Handlera w web.config’u?

Może powinno być coś na ten wzór:

2:   

   3:   

   4:

Dodane 08.07.2010 (Cz) 23:55 – Już sobie poradziłem. Błąd oczywiście banalny:( Dziękuję Wam bardzo za serdeczną pomoc. Powinno być: VehicleImage.aspx:

...

this.imgVehicle.ImageUrl = String.Format("~/VehicleImage.ashx?thumbnail=0&;imageid={0}", this.Request.QueryString["imageid"]);

...

Pozdrawiam

Generalnie to nie rozumiem Twojego rozwiązania tego problemu. Handlery działają tak, że w momencie, gdy następuje odwołanie do jakiegoś konkretnego zasobu, w tym wypadku jest to plik o rozszerzeniu .ashx, a dokładnie plik VehicleImage.ashx to jego przetwarzaniem zajmuje się odpowiednia klasa Handlera, w tym wypadku jest to klasa VehicleImage.

Jedynym wyjaśnieniem tego, że w momencie, gdy na jakiejś innej stronie miałeś odwołanie do pliku VehicleImage.ashx i obrazek nie wyświetlał się prawidłowo wydawało się być to, że w konfiguracji serwera www jest błąd. Czyli po prostu serwer www nie wiedział, co zrobić z danym zasoboem.

Co do tego błędu, który Ci się pojawił po dodaniu nowego wpisu w konfiguracji to chciałem zapytać, czy masz tą klasę VehicleImage umieszczoną w jakiejś przestrzeni nazw i jak ogólnie wygląda początkowa deklaracja tego pliku, w którym masz tą klasę VehicleImage oraz jakiego serwera IIS używasz (wersja 7.0 czy starsza). No ale teraz to już nieważne.

Czyli z konfiguracji wywaliłeś ten wpis

a w kodzie jedynie wstawiłeś teraz

this.imgVehicle.ImageUrl = String.Format("~/VehicleImage. aspx?thumbnail=0&;imageid={0}", this.Request.QueryString[“imageid”]);

?

No ale ważne, że działa :stuck_out_tongue:

Pozdrawiam,