Visualizzazione dei risultati da 1 a 7 su 7

Discussione: problema forward

  1. #1

    problema forward

    Salve a tutti,

    Sono nuovo del forum, nonostante già da tempo conosco e usufruisco delle tante chicche di questo sito.

    Ho un problema:

    ho scritto una jsp con delle option dove sono presenti una serie di parametri che mi servono per scaricare/generare un report (pdf, rtf o xls).
    Quando clicco sul bottone, invio la richiesta ad una servlet, la quale verifica se il file esiste (in una cartella superiore alla webbap) ed in caso contrario provvede a generarlo e uplodarlo sul file system... e fin qui tutto bene

    Il problema nasce dal fatto che oltre a fare l'upload, subito dopo devo far fare il download del report all'utente e in seguito ridirigerlo sulla jsp di origine.

    Il metodo per il download nella servlet è il seguente:

    private static void downloadFile(HttpServletResponse response, HttpServletRequest request, File file, String fileName) throws IOException{
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
    response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");
    response.setContentType(request.getContentType());
    try {
    byte[] buff = new byte[2048];
    int bytesRead;
    while (-1 != (bytesRead = bis.read(buff, 0, buff.length)))
    {
    bos.write(buff, 0, bytesRead);
    }
    } catch (IOException e) {
    throw e;
    } finally {
    if (bis != null)
    bis.close();
    if (bos != null)
    bos.close();
    }
    }

    Il problema si verifica quando cerco di fare la forward dopo questo metodo, perchè mi dice che non posso forwardare dopo aver effettuato la commit della response (e ha ha ragione perchè la faccio nel metodo download)...

    Suggerimenti?

    Grazie in anticipo

    Valerio

  2. #2
    Se ho capito bene secondo me ti conviene fare l'upload, poi la forward su una jsp dove ci sarà il link al report , per scaricarlo in download , e alla pagina di partenza.

    Visto che per una Request corrisponde una sola Response potresti anche fare con un solo click due richieste così da avere due risposte dal server.
    Nella prima il redirezionamento sulla pagina iniziale e nella seconda upload e poi download del report.


    ES:
    codice:
    click
    In questo caso viene aperta la URL1 nel browser corrente e in una nuova pagina la URL2.
    Nel caso venga disabilitato javascript il giochetto non funziona.

  3. #3
    Aggiungo un'altra idea, fai una forward verso un'altra servlet che si occuperà di far scaricare il file...

  4. #4
    Originariamente inviato da snakeplinsky
    Se ho capito bene secondo me ti conviene fare l'upload, poi la forward su una jsp dove ci sarà il link al report , per scaricarlo in download , e alla pagina di partenza.

    Visto che per una Request corrisponde una sola Response potresti anche fare con un solo click due richieste così da avere due risposte dal server.
    Nella prima il redirezionamento sulla pagina iniziale e nella seconda upload e poi download del report.
    Il problema è che io non so a priori se il file esiste sul server, quindi prima devo verificare l'esistenza, eventualmente crearlo e poi fare il download... se lo metto direttamente nel link e non lo trova mi solleva un'eccezione

    Grazie cmq della risposta... Altre idee?

    V

  5. #5
    Originariamente inviato da francesco.muia
    Aggiungo un'altra idea, fai una forward verso un'altra servlet che si occuperà di far scaricare il file...
    La servlet per il download ce l'ho già... il problema è la redirect dopo il download...


  6. #6
    Forse non sono stato abbastanza chiaro , come ho scritto su una URL fai la submit ad una servlet che controlla se il file esiste e se non esiste lo crea e poi fa forward sul file per scaricarlo , nell'altra URL chiami la pagina iniziale.
    Per comodita chiami su URL1 , così da trovarti nello stesso browser la pagina iniziale e su URL2 la submit alla servlet che ti interessa che fa upload e poi il download.

  7. #7
    Originariamente inviato da snakeplinsky
    Forse non sono stato abbastanza chiaro , come ho scritto su una URL fai la submit ad una servlet che controlla se il file esiste e se non esiste lo crea e poi fa forward sul file per scaricarlo , nell'altra URL chiami la pagina iniziale.
    Per comodita chiami su URL1 , così da trovarti nello stesso browser la pagina iniziale e su URL2 la submit alla servlet che ti interessa che fa upload e poi il download.
    In realtà non è così lineare, perchè c'è un meccanismo di redirect tramite una Servlet che fa da controller e tutte le altre sono sottoclassi... Purtroppo il progetto l'ho trovato già così e non ho tempo di sconvolgerlo troppo (a parte hibernate non usa nemmeno nessun framework)...

    Cmq ho risolto: alla servlet che in origine creava, uplodava e downlodava il report ora faccio fare solo le prime due operazioni e valorizzare una variabile String con il path che metto in sessione; nella pagina pagina jsp principale (che fa da cornice a tutte le altre e fra l'altro l'unica col body) se la variabile in sessione è valorizzata lancio javascript sul body onload window.open(Download.java + path file dalla sessione) e come ultima cosa tolgo il path dalla sessione...

    Funzionaaaaaa!



    PS Grazie, avrò modo di utilizzare sicuramente in futuro la tua soluzione.

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.