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


(Kasman) #1

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…


(Tomek Matz) #2

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

(Kasman) #3

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:


(somekind) #4

Przecież jest zamykane.

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


(Tomek Matz) #5

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.


(Kasman) #6

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


(Tomek Matz) #7

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,