2010-01-22 15 views
8

To może brzmieć zupełnie głupie, ale jest to przypadek prawdziwym życiu :(Jak wyświetlać plik z JSP? .

jestem w stanie wyświetlić tabelę HTML z „wirtualnym” nazwa łącza

coś takiego:

Xyz description <a href="docId=123">document.doc</a> 

Xyz description <a href="docId=456">documentB.doc</a> 

Xyz description <a href="docId=798">documentC.doc</a> 

Ten id doc reprezentuje identyfikator w bazie danych (na docs te są przechowywane w blob jako byte [])

każdym razie. Jestem w stanie uzyskać ten identyfikator, zapytań do bazy danych i odzyskać byte [] (a nawet zapisać go w pliku tmp)

To, czego nie mogę wymyślić, to zrobić, gdy użytkownik kliknie na link (a po wykonaniu pobierania bazy danych) "poda" bajt [] użytkownikowi.

Teraz najgorsza część, a to, co sprawia, że ​​zadaję to pytanie tutaj, to muszę zrobić tylko z JSP (bez serwletu) i bez bibliotek stron trzecich (tylko ... nie pytaj mnie, dlaczego nienawidzę to też)

So. Jak mogę służyć w JSP binarną zawartość tablicy bajtów przechowywanych w systemie plików serwera

Mój pierwszy gości jest:

<% 
InputStream read // read the file form the fle system 
response.getOutputStream().write(theBytesReader); 
%> 

jestem blisko do rozwiązania?

Czy ta praca jest dla klienta tak, jakby naprawdę kliknął na serwerze dla prawdziwego pliku?

Z góry dziękuję.

Odpowiedz

5

Do rzeczy wystarczy napisać ten sam kod w JSP, co w przypadku Servlet class. Możesz go praktycznie skopiować. Upewnij się tylko, że jesteś , a nie zapisuj w strumieniu tekstów wszystkich szablonów, włączając w to liniowe i białe spacje poza skryptletami. W przeciwnym razie zostałby zapisany do pliku binarnego i uszkodziłby go.

Jeśli masz kilka bloków skrypty, to trzeba zorganizować je tak, że nie ma LINEBREAK między kończącym %> z scriptlet i wyjściowego <% następnego scriptlet. Tak więc np.

<%@page import="java.io.InputStream" %><% 
    //... 
%> 

zamiast

<%@page import="java.io.InputStream" %> 
<% 
    //... 
%> 
+0

Umieść kod w pliku JSP zgodnie z poleceniem BalusC, ale użyj polecenia 'out.clear();', aby wyczyścić dane wyjściowe, zamiast zmyślać formatowanie strony. –

1

Coś takiego ...

InputStream instr = null; 
try { 
    instr = new BufferedInputStream(new FileInputStream("file.txt")); 
    for(int x=instr.read(); x!=-1; x=instr.read()){ 
     out.write(x); 
    } 
} finally { 
    out.close(); 
    if(instr != null) instr.close(); 
} 

Trzeba to jako odpowiedzi na kliknięcie (bądź na przeładowania strony lub w innym pliku JSP).

Istnieją lepsze rozwiązania buforujące, które można wykonać za pomocą zapisu z użyciem tablic bajtowych zamiast pojedynczych ... Zostawiam to dla ciebie.

Przykro mi, że utknąłeś w JSP scriptlet land ... Mam nadzieję, że to pomaga.

+0

trzeba ustawić typ MIME w odpowiedzi, a także jak w moim przykładzie. –

+0

Prawda ... Przyjąłem tę część, dziękuję za wyjaśnienie. – cjstehno

2

Musisz ustawić typ MIME w odpowiedzi HTTP, jak poniżej, oprócz przykładowego kodu, który podałeś.

response.setContentType("application/octet-stream"); 

Uwaga: typ MIME aplikacji/strumienia Oktet służy do wskazania pliku binarnego.

+0

Tak, już to mam, faktycznie używam jak: 'application/vnd.ms-excel' ale moje prawdziwe pytanie brzmi, czy ta metoda zadziała? (czytanie i pisanie za pomocą response.out?) – OscarRyz

+0

Tak, powinno to trwać tak długo, jak typ MIME jest poprawny. –

+0

W rzeczywistości ludzie robią to dość często, aby wyświetlać obrazy dynamiczne, na których znajduje się URL obrazu, który jest podobny do /foo/bar/yourImage.jsp, i wyświetla obraz dynamicznie, zwracając bajty obrazu oraz ustawiając obraz/gif lub podobnie jak typ zawartości. –

2

Proszę, proszę, proszę, nie rób tego.

Robisz krzywdę dla użytkowników.

HTTP jest niezwykle bogaty pod względem tego, co może zrobić z plikami. Buforowanie, dzielenie, dostęp losowy itp.

Spójrz na coś podobnego do FileServlet i zmień to, aby pasował. Tak, jest to Servlet, a nie JSP, ale to jest to, co chcesz zrobić, aby być dobrym obywatelem HTTP.

Niektóre pojemniki mają inne opcje, których można użyć, można siekać Kocurek DefaultServlet itd

+0

To nie jest odpowiedź na moje pytanie, ale komentarz, jestem świadomy, że można to osiągnąć za pomocą serwletów, ale jeśli czytasz moje pytanie to nie jest opcja :(Przykro mi, ale twoja odpowiedź nie jest pomocna – OscarRyz

+0

JSP jest serwletem, możesz osadzić 99% kodu na stronie JSP i uzyskać to samo. –

Powiązane problemy