Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37

    servlet response immagini

    Ragazzi ho un problema con una servlet.
    La mi a servlet dopo varie istruzioni ricava delle immagini e le salva in una cartella, dopo di che prima di concludere vorrei visualizzare queste immagini sulla pagina web che interroga la mia servlet, allora ho scritto questo blocco di codice:

    numImg = 1;
    byte[] bytes;
    while(numImg<=9)
    {
    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    BufferedImage outImage = ImageIO.read(new File(servletPath+"/images/"+request.getSession()+"mappaTagliata_"+numImg+".g if"));
    ImageIO.write((RenderedImage)outImage, "GIF", bout);
    bytes = bout.toByteArray();
    out2.write(bytes);
    System.out.println("sono quiiiiii");
    numImg++;
    }

    che mi permette però di vedere una sola immagine (la prima) di nove che sono presenti nella directory.
    Come posso lavorare sulla response in modo da ottenere tutte le immagini???

    è abbastanza urgente.... rispondete appena potete... :-) grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    è abbastanza urgente...
    affari tuoi. Qui è tutto urgente allo stesso modo.

    Venendo al problema in questione: verso chi mandi quel codice? Se mandi così verso il browser, ovviamente vedrai una sola immagine (anzi forse nel log del server trovi anche degli errori visto che l'output l'hai già mandato) - ammesso e non concesso che il browser sappia interpretare (vabbhé oramai non c'è problema, ma qualche anno fa sì) una GIF di suo.

    Come si risolve? Devi creare una pagina in cui mostrare le tue immagini, ed in quella, nel src del tag img di ciascuna immagine, andare a chiamare la servlet (con opportuni parametri) che vada fisicamente a leggere il bytecode della immagine.

    Ovvero avrai qualcosa del genere
    codice:
    [img]tuaServletImmagini?img=x[/img]
    ed in tuaServletImmagini, andrai a recuperare l'immagine x e, sistemato a dovere l'header (ovvero assicurati di mandare un'immagine), sparerai il bytecode in uscita.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: servlet response immagini

    Originariamente inviato da vanno88
    Ragazzi ho un problema con una servlet.
    La mi a servlet dopo varie istruzioni ricava delle immagini e le salva in una cartella, dopo di che prima di concludere vorrei visualizzare queste immagini sulla pagina web che interroga la mia servlet
    Alt. Innanzitutto questa "cartella" è visibile dal client? Se sì, quando generi la pagina HTML da inviare al client, semplicemente dentro ci metti i vari <img> con gli src che "puntano" alle immagini in quella cartella.

    Se la cartella non è visibile, devi predisporre una servlet che è dedicata solo al download di 1 immagine. Nei src di <img> fai puntare ad un URL che richiama la servlet passando "qualcosa" come parametri. Unica questione: come indicare tramite uno o più parametri quale immagine far scaricare. Lo devi stabilire tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    provo a seguire i vostri consigli :-) vi faccio sapere al più presto....

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    Ragazzi cambio di domanda:

    Servlet:
    Data un'immagine, la trasformo in array di byte cosi da poter inviare all'esterno utilizzando:
    out.write(bytes[]);

    Ora volgio che un'applicazione java mi faccia una connessione http alla mia servlet, che riceva cosi l'array di byte e che ricostruisca l'immagine....


    Qui sorgono i dubbi:
    la out.write(byte[]); dovrebbe restituire alla mia applicazione java una stringa che deve essere letta riga per riga con il seguente metodo: input.readLine()) dove input è un BufferedReader.

    1) la riga letta è una stringa e quindi devo convertirla con il getBytes() oppure sono già i miei byte?
    2) visto che leggo riga per riga mi chiedevo ma ogni riga deve essere messa in una posizione diversa di un'array in modo da poter ricostruire l'immagine con il seguente metodo:
    ImageIO.read(new ByteArrayInputStream( byte[] )); ?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vanno88
    Servlet:
    Data un'immagine, la trasformo in array di byte cosi da poter inviare all'esterno utilizzando:
    out.write(bytes[]);
    Ma dipende da cosa intendi per "immagine": un file? o un oggetto Image?

    In questa servlet dedicata allo scaricamento di una immagine dovresti inviare sulla response:

    a) se è un file sul file-system, lo apri, leggi dal InputStream a blocchi (piccoli es. 1024 o 2048) e scrivi sulla response (il ServletOutputStream). Non devi allocare array di chissà quale dimensione!!

    b) se è un oggetto BufferedImage, usi il write di ImageIO a cui passi il ServletOutputStream.

    Originariamente inviato da vanno88
    Ora volgio che un'applicazione java mi faccia una connessione http alla mia servlet, che riceva cosi l'array di byte e che ricostruisca l'immagine....
    Una applicazione "client", quindi?
    Usi le classi del package java.net. Parti da un URL, ottieni un URLConnection, connetti. Se ok (status che indica successo) prendi l'InputStream e lo passi a read di ImageIO e hai il tuo bel BufferedImage.


    Originariamente inviato da vanno88
    la out.write(byte[]); dovrebbe restituire alla mia applicazione java una stringa che deve essere letta riga per riga con il seguente metodo: input.readLine()) dove input è un BufferedReader.
    No.

    Originariamente inviato da vanno88
    1) la riga letta è una stringa e quindi devo convertirla con il getBytes() oppure sono già i miei byte?
    2) visto che leggo riga per riga mi chiedevo ma ogni riga deve essere messa in una posizione diversa di un'array in modo da poter ricostruire l'immagine con il seguente metodo:
    ImageIO.read(new ByteArrayInputStream( byte[] )); ?
    No, stai andando fuori strada, per gestire immagini lascia perdere "righe", stringhe o altro di simile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    mi sembra che tu hai centrato il discorso alla grande..
    Entriamo un pò più nel dettaglio, nella servlet ho da prendere l'immagine da una cartella e pertanto leggerla e inviarla sulla ServletOutputStream come faccio???

    BufferedImage outImage;
    outImage = ImageIO.read(new File(servletPath+"/images/"+request.getSession()+"mappaTagliata_1.gif")) ;
    ImageIO.write((RenderedImage)outImage, "GIF", out2);

    cosa succede?? dovrebbe succedere che mi mette su out2 che è il mio ServletOutputStream la mia immagine da inviare.

    come faccio a leggere dalla mia applicazione client quello che ho appena scritto???

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vanno88
    mi sembra che tu hai centrato il discorso alla grande..
    Entriamo un pò più nel dettaglio, nella servlet ho da prendere l'immagine da una cartella e pertanto leggerla e inviarla sulla ServletOutputStream come faccio???
    FileInputStream per aprire il file in lettura, allocazione di un byte di X byte, solito ciclo di lettura "finché ci sono byte" e scrittura di ogni blocco sul ServletOutputStream.

    Occhio, l'ho appena detto in un'altra discussione, l'ultimo blocco può non riempire il buffer, quindi deve sempre tenere in considerazione il length che read() ti fornisce.

    Originariamente inviato da vanno88
    BufferedImage outImage;
    outImage = ImageIO.read(new File(servletPath+"/images/"+request.getSession()+"mappaTagliata_1.gif")) ;
    ImageIO.write((RenderedImage)outImage, "GIF", out2);

    cosa succede?? dovrebbe succedere che mi mette su out2 che è il mio ServletOutputStream la mia immagine da inviare.
    Sì ma se non ci devi "lavorare" sul BufferedImage .... è inutile!!! Nonché per un formato come il GIF che ha numero di colori ridotto, potrebbe anche alterare la immagine nel modo che non vuoi!

    Originariamente inviato da vanno88
    come faccio a leggere dalla mia applicazione client quello che ho appena scritto???
    L'ho detto prima. Parti da un URL, ottieni un URLConnection, connetti. Se lo status è ok (normalmente 200), ottieni dal InputStream. Basta passare questo InputStream al read() di ImageIO.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    andbin ti adoro mi stai aiutanto veramente tantissimooooo....

    Bene funziona........

    sono riuscito (grazie a te andbin) a fare salvare l'immagine al client...
    Ora come posso anzi che inviare una sola immagine, inviarne più di una e di conseguenza riceverne più di una senza fare casini tra invio ricezione??

    sono felicissimooooooooo

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    37
    Ho fatto cosi: SERVLET:

    BufferedImage outImage;

    outImage = ImageIO.read(new File(servletPath+"/images/"+request.getSession()+"mappaTagliata_1.gif")) ;
    ImageIO.write((RenderedImage)outImage, "GIF", out2);

    CLIENT:

    URL url = new URL("http://83.211.114.228:8080/test/ProvaGoogleMaps?latitudine=41.893554&longitudine=1 2.480469&zoom=10");
    URLConnection urlConnection = url.openConnection();

    BufferedImage image = ImageIO.read(urlConnection.getInputStream());
    File outputFile = new File(servletPath+"/images/miaImmagineeeeeeee.gif");
    if(image==null)
    System.out.println("ATTENZIONE: immagine: non recuperata.");
    else
    ImageIO.write((RenderedImage)image, "GIF", outputFile);


    Uso il BufferedImage perchè nella Image.read(urlConnection.getInputStream()); mi restituisce un BufferedImage pertanto ho pensato fosse meglio scrivere un immagine bufferizzata piuttosto che una semplice immagine.
    SBAGLIO??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.