Servlet per download di file
Probabilmente vi sarà capitato di dover creare all’interno di un pagina web un link ad un file non residente fra le cartelle gestite dal Web Server.
Tale file, in una situazione del genere, non risulta accessibile tramite un semplice href ma lo diventa tramite l’utilizzo di una semplice servlet:
Di seguito il codice della servlet
1 2 3 4 5 6 7 8 9 10 11 |
/** * Servlet implementation class OpenFile */ public class OpenMyFile extends HttpServlet { private static final long serialVersionUID = 1L; private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB. public final static Logger logger = Logger.getLogger("info.synaptica.ifaber.servlet.OpenMyFile"); public OpenMyFile() { super(); } |
Definizione del metodo doGet:
inizialmente vengono letti i parametri passati tramite URL “fname” e “sid”.
Il parametro fname descrive il path completo e il nome del file da scaricare, il sid contiene l’identificativo
della sessione in corso, la sua funziona è quella di stabilire l’autorizzazione all’utilizzo da parte del client chiamante.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String requestedFile = request.getParameter("fname"); if (requestedFile == null) throw new Exception("Specificare nome file"); String sid = request.getSession().getId(); if (sid.equals(request.getParameter("sid")) == false) { throw new Exception("Non autorizzato all'utilizzo della servlet"); } |
Impostazione della response con la definizione dell’internet media type.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
File file = new File(URLDecoder.decode(requestedFile, "UTF-8")); logger.info("File richiesto: " + URLDecoder.decode(requestedFile, "UTF-8")); if ( (file.isDirectory())||(!(file.exists()))) { throw new Exception("Il file richiesto non è stato trovato nell'archivio"); } String contentType = getServletContext().getMimeType(file.getName()); if (contentType == null) { contentType = "application/octet-stream"; } response.reset(); response.setBufferSize(DEFAULT_BUFFER_SIZE); response.setContentType(contentType); response.setContentLength((int) file.length()); response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); |
Apertura ed esecuzione dello streaming del file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// Prepare streams. BufferedInputStream input = null; BufferedOutputStream output = null; try { // Open streams. FileInputStream fi = new FileInputStream(file); input = new BufferedInputStream(fi, DEFAULT_BUFFER_SIZE); output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE); // Write file contents to response. byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; int length; while ((length = input.read(buffer)) > 0) { output.write(buffer, 0, length); } } finally { // Gently close streams. close(output); close(input); } } catch (Exception E) { response.getWriter().write("Rilevato problema durante la richiesta del file: " + E.getMessage()); //response.flushBuffer(); } } |
Metodo per la chiusura del buffer di lettura e di scrittura dati
1 2 3 4 5 6 7 8 9 10 11 12 |
private static void close(Closeable resource) { if (resource != null) { try { resource.close(); } catch (IOException e) { // Do your thing with the exception. Print it, log it or mail it. e.printStackTrace(); } } } } |
Ricordiamoci di registrare la servlet creata nel file web.xml solitamente posizionato nella cartella
/WebContent/WebInf del progetto.
La registrazione consiste nell’aggiungere all’xml le seguenti righe:
1 2 3 4 5 6 7 8 9 10 |
<servlet> <description>Open File</description> <display-name>OpenMyFile</display-name> <servlet-name>OpenMyFile</servlet-name> <servlet-class>"classe di riferimento della servlet"</servlet-class> </servlet> <servlet-mapping> <servlet-name>OpenMyFile</servlet-name> <url-pattern>/OpenMyFile</url-pattern> </servlet-mapping> |
Una risposta.
grazie mi hai risolto un problema che durava da 1 settimana!!