Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JSP] Forzare download .txt

    Salve a tutti,
    ho un problema con le pagine JSP. Devo dare la possibilità ad un utente di poter scaricare un file .txt. ma il browser me lo visualizza in una nuova finestra come posso forzare lo scaricamento del file .txt facendo comparire la finestra di download? Grazie 1000 per l'aiuto

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

    Re: [JSP] Forzare download .txt

    Originariamente inviato da eziolink88
    ho un problema con le pagine JSP. Devo dare la possibilità ad un utente di poter scaricare un file .txt. ma il browser me lo visualizza in una nuova finestra come posso forzare lo scaricamento del file .txt facendo comparire la finestra di download?
    Quando viene fatta la request per il file .txt nella response bisogna settare un apposito "content type" ad esempio "application/octet-stream".
    E si può fare in diversi modi. Se vuoi che qualunque txt venga sempre forzato al download puoi andare nel DD (web.xml) e impostare la mappatura del mimetype, cioè alla estensione txt associ application/octet-stream. Questa impostazione è "globale".

    Se solo certi file .txt e solo in certe situazioni vuoi che siano forzati al download, ci sono altre soluzioni. Ad esempio un Filter che esamina la request e se c'è una query string es. "....bla/tuofile.txt?download" allora crei un wrapper della response in modo che imponga il content type e poi lo passi al filter chain.

    Altrimenti dovresti fare una servlet, però nella pagina da cui scarichi il txt devi cambiare l'URL per scaricare il file, ad esempio mettere "download.do?file=blabla/tuofile.txt" e download.do lo associ alla servlet. La servlet imposta il content type e legge dal file e lo invia sulla response. Insomma devi fare un po' di lavoro.

    La soluzione del filtro la trovo simpatica e interessante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ciao a grazie per avermi risp. così tempestivamente, potresti spiegarmi meglio questo metodo:

    Se solo certi file .txt e solo in certe situazioni vuoi che siano forzati al download, ci sono altre soluzioni. Ad esempio un Filter che esamina la request e se c'è una query string es. "....bla/tuofile.txt?download" allora crei un wrapper della response in modo che imponga il content type e poi lo passi al filter chain.
    sai dove posso trovare del codice d'esempio? il JSP lo sto studiando da poco. Grazie per la pazienza

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da eziolink88
    sai dove posso trovare del codice d'esempio?
    Ecco un esempio:

    codice:
    package tuopackage;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class DownloadFilter implements Filter {
        public void init(FilterConfig filterConfig)
        throws ServletException {}
    
        public void destroy() {}
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
            if (request.getParameter("download") != null) {
                response = new DownloadResponseWrapper((HttpServletResponse) response);
            }
    
            chain.doFilter(request, response);
        }
    
    
        private static class DownloadResponseWrapper extends HttpServletResponseWrapper {
            public DownloadResponseWrapper(HttpServletResponse response) {
                super(response);
                super.setContentType("application/octet-stream");
            }
    
            public void setContentType(String type) {}
        }
    }
    Nota che non basterebbe invocare response.setContentType("application/octet-stream"); e poi banalmente passare subito questa response al filter chain. Perché poi la "risorsa" nel server che gestisce l'invio di file statici comunque cambierebbe il content type secondo la mappatura standard.

    Facendo come sopra invece viene creato un wrapper della response in cui setContentType() non ha più effetto perché vuoto.

    Nel DD (web.xml) puoi mappare così:

    codice:
      <filter>
        <filter-name>DownloadFilter</filter-name>
        <filter-class>tuopackage.DownloadFilter</filter-class>
      </filter>
    
      <filter-mapping>
        <filter-name>DownloadFilter</filter-name>
        <url-pattern>*.txt</url-pattern>
      </filter-mapping>
    Il filtro viene quindi eseguito ad ogni richiesta di file .txt ma solo se c'è ?download come query causa il download forzato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.