Servlet do pobierania obrazków i miejsce źródłowe dla obiektu File

    Dzisiaj głównie 2 rzeczy: Jak pobierać obrazki z przeglądarki i miejsce źródłowe dla obiektu File.

    Co się dzisiaj wydarzyło? Otóż powstało małe zamieszanie. Kontynuuję przerabianie tego filmiku instruktażowego o tworzeniu aplikacji internetowych w Javie.

    Gdy wykonałem wszystko co było pokazane, to jednak obrazek nie pobierał się.

    Mój kod wyglądał tak:

byte[] bufor = wczytajPlik("obrazek.png");
        response.setContentType("image/png");
        response.setContentLength(bufor.length);
        response.addHeader("Contetnt-Disposition", "attachment;filename=obraz.png");
        OutputStream os = response.getOutputStream();
        os.write(bufor);
        os.flush();
    }

    private byte[] wczytajPlik(String nazwaPliku) throws IOException {
        File file = new File(nazwaPliku);
        long rozmiar = file.length();
        byte[] zawartosc = new byte[(int)rozmiar];
        FileInputStream fis = new FileInputStream(file);
        fis.close();
        return zawartosc;
    }
}


    A struktura katalogów tak:


    Po uruchomieniu Tomcata wyskakiwał błąd 404 o takim wyglądzie:

    Domyślałem się, że chodzi o lokalizację obrazka. To było dla mnie dziwne, bo zazwyczaj pisząc w Javie jak umieszczałem obrazek w głównym katalogu projektu, to program pobierał poprawnie, jednak nie tym razem. Umieszczałem obrazek w rozmaitych katalogach, jakie przyszły mi do głowy, ale dalej błąd był ten sam. Bylem zagubiony, a w sieci nie bardzo wiedziałem czego szukać, bo nowych i obcobrzmiących dla mnie komend było bardzo dużo. Dlatego, postanowiłem opisać mój problem na grupie i otrzymałem pomoc.

    Na początku ustaliłem gdzie przechowuję obrazki. Co ciekawe to komenda pwd w katalogu projektu nie pomogła, bo ona wskazywała na mój główny folder AnotherHW, ale tam nie działało. Odpowiednie miejsce dopiero okazały się pokazać polecenia: 

String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);


    Dzięki nim dowiedziałem się, że miejsce skąd obiekt File pobiera obrazek w moim Servlecie to folder bin w Tomcacie!

    To był przełom, jednak to dopiero była częściowa informacja. Po tym jak namierzyłem właściwą lokalizację, to oczom mym w przeglądarce ukazał taki oto kwadracik na białym tle:

 


    Nie wiedziałem o co chodzi, ale okazało się po chwili, że jakimś cudem pominąłem jedną komendę z filmiku, a mianowicie fis.read() po linijce FileInputStream fis = new FileInputStream(file);

   Po poprawieniu tego obrazek wyświetlał się w przeglądarce, ale nie pobierał się tak jak na filmiku. Po szybkim porównaniu kodu z filmikiem okazało się, że miałem literówkę w słowie "Content-Disposition", po poprawieniu literówki obrazek poprawnie się pobierał.

    Ależ się cieszę. Trochę się namęczyłem, żeby do tego dojść, ale przynajmniej trochę się przyjrzałem kodowi i już jest mi nieco bliższy i bardziej zrozumiały, a to przecież mi od początku chodziło, więc cały czas do przodu :)

    To tyle ode mnie na dziś, zapraszam Ciebie do dzielenia się swoim dzisiejszym odkryciem  np. w komentarzu :)

Komentarze

Popularne posty z tego bloga

IntelliJ: zmiana rozmiaru czcionki scrollem

ThunderBird: jak zrobić professional stopkę