Witam.
Wie ktoś jak można wyświetlić zdjęcie na stronie poprzez servlet?? mając (File f) "f" to moje zdjęcie.
Ustaw headery, a potem wypluj zdjęcie na out.
http://blog.codebeach.com/2008/02/watermarking-images-in-java-servlet.html - i nawet znak wodny wstawia ;)
Za to kocham Vaadin. po prostu wstawiam Image i mi wisi jak to działa w środku :D
Zalozmy ze masz zdjecia w katalogu $contextroot/images/. Stworz sobie np ImageDownloadServlet ktory bedzie zmapowany do url '/images/*'. Servlet ten by bral sciezke, na jej podstawie wczytywal plik i zapisywal go do responsa. Obrazki na stronce beda mialy URL typu "/images/mojobrazek.jpg". Jak pewnie wiesz, kazdy taki obrazek to osobne rzadanie do serwera, ktore w tym przypadku by bylo przetwarzane przez twoj ImageDownloadServlet. Koniec.
Jakie headery??
mój kod wyglada tak:
plik.jsp:
<FORM ACTION="NewServlet" METHOD="POST" ENCTYPE="multipart/form-data">
<br>Zdjęcie: <INPUT type="file" name="obraz" ><br>
<input type="submit" name="ok" value="Wyślij"/>
</FORM>
Servlet:
public class NewServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("text/html;charset=UTF-8");
ServletOutputStream out = response.getOutputStream();
String filename = multi.getFilesystemName("obraz");
String type = multi.getContentType("obraz");
File f = multi.getFile("obraz");
out.println("<br>nazwa pliku: "+filename);
out.println("<br>typ: "+type);
?????
}
filename zwraca mi nazwe pliki, type zwraca mi typ pliku
i co teraz aby wyświetlic zdjecie?
Napisz co chcesz wlasciwie zrobic, bo z kodu to wyglada jakbys chcial zrobic stronke uploadu zdjec na serwer, i po submicie pokazac zdjecie na stronce. Czy o to chodzi?
java.io.File nie przechowuje żadnych danych. Potrzebujesz np FileInputStream albo jakiegoś bufora czy innego InputStream itp itd żeby go wypluć.
tak. Wybieram przez przeglądarkę zdjęcie po czym wyświetla się za stronie. Ewentualnie moge zapisać je do bazy danych ale to inny temat i wiem jak to zrobic.
...
String filename = multi.getFilesystemName("obraz");
String type = multi.getContentType("obraz");
File f = multi.getFile("obraz");
out.println("<br>nazwa pliku: "+filename);
out.println("<br>typ: "+type);
InputStream in = new FileInputStream(f);
InputStream imageStream = new BufferedInputStream(in);
Image image = (Image) ImageIO.read(imageStream);
???
lub
BufferedImage BI = ImageIO.read(f);
ale jak wyswietlic BI lub image ??
Juz czaje co chyba ma byc. Chcesz w input podac nazwe pliku ktory jest na serwerze, i w odpowiedzi na submit pokazac ten obrazek?
public class NewServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
response.setContentType("image/png");
ServletOutputStream out = response.getOutputStream();
String filename = multi.getFilesystemName("obraz");
String type = multi.getContentType("obraz");
File f = multi.getFile("obraz");
out.println("<br>nazwa pliku: "+filename);
out.println("<br>typ: "+type);
// ?????
FileInputStream in = null;
try {
in = new FileInputStream(f);
int read;
while ((read = in.read()) != -1) {
out.write(read);
}
} catch (IOException exc) {
} finally {
if (in != null) {
in.close();
}
}
}
Powyzszy kod nie byl kompilowany wiec moze nie dzialac, ale zasade powinienes wyczaic. Nie wiem tylko czemu ustawiales content type na text/html skoro chcesz wyslac obrazek?
Ogolnie to tylko moj domysl co checsz osiagnac, mam nadzieje ze to tylko w celu pobawienia sie / potestowania, bo gdzie indziej ten use case nie ma wielkiego sensu.
Dziękuje. Działa :)
Kod powyżej byłby dobry gdyby:
- wywalić te println z tekstem,
- response.setContentType(multi.getContentType("obraz")); (tak mi się wydaje),
EDIT:
za późno :P
@donek - z setContentType nie do konca zrobilem poprawnie, nie zawsze w koncu bedzie to PNG, wymagany jest jakis sposob wykrycia typu obrazka (nie wiem czy getContentType("obraz") zadziala, nie wiem co to robi ;d. Kod byl dla ilustracji, niemniej masz racje ze powinno byc inaczej.