Scarica un file con JSF?

qual è il modo giusto per scaricare un file usando JSF ?, semplicemente mettendo un link al file ?? in tal caso come ottengo l’URL del file ??

ho visto un esempio usando BufferedInputStream:

http://www.winstonprakash.com/articles/jsf/file_download_link.htm

Quali sono le differenze?

Grazie

Se si tratta di un file semplice, è sufficiente posizionarlo in un webcontent pubblico (lì dove si inseriscono i file statici e JSF) e creare un collegamento.

link 

Il servlettainer si preoccuperà di applicare le intestazioni corrette.

Se si trova al di fuori del contenuto Web pubblico per alcuni motivi specifici (ad esempio in un percorso fisso sulla macchina server o in un database), quindi creare un servlet che ottiene un InputStream di esso e lo scrive OutputStream della risposta almeno lungo il Intestazioni Content-Type , Content-Disposition e Content-Length . Puoi trovare qui un semplice esempio di kickoff. Inoltre, questo può semplicemente essere collegato al url-pattern della servlet.

Se deve essere generato dynamicmente e in base ai parametri di richiesta specifici JSF, è ansible farlo anche in un’azione bean gestita associata a h:commandLink o h:commandButton , ma è necessario assicurarsi di chiamare FacesContext#responseComplete() alla fine del metodo di azione del bean per impedire a JSF di prendere la navigazione in mano. Lo stesso tipo di codice servlet può essere riutilizzato per lo streaming del file. Puoi trovare un esempio di kickoff in questa risposta .

Avevo bisogno di creare un codice simile per scaricare un file tramite JSF

Questo è il mio pulsante di download nella mia pagina JSF

  

Ed è il mio codice Java

 public void downloadFile() { File file = new File("/home/marco/file.txt"); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); response.setHeader("Content-Disposition", "attachment;filename=file.txt"); response.setContentLength((int) file.length()); ServletOutputStream out = null; try { FileInputStream input = new FileInputStream(file); byte[] buffer = new byte[1024]; out = response.getOutputStream(); int i = 0; while ((i = input.read(buffer)) != -1) { out.write(buffer); out.flush(); } FacesContext.getCurrentInstance().getResponseComplete(); } catch (IOException err) { err.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (IOException err) { err.printStackTrace(); } } } 

Ho avuto un errore su

 FacesContext.getCurrentInstance().getResponseComplete(); 

dal tipo

 java.lang.IllegalStateException: getOutputStream() has already been called for this response 

e l’ho risolto:

Pagina JSF:

  

Metodo di fagioli:

 public void downloadFile(File file) { FacesContext facesContext = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse(); response.setHeader("Content-Disposition", "attachment;filename=file.txt"); response.setContentLength((int) file.length()); FileInputStream input= null; try { int i= 0; input = new FileInputStream(file); byte[] buffer = new byte[1024]; while ((i = input.read(buffer)) != -1) { response.getOutputStream().write(buffer); response.getOutputStream().flush(); } facesContext.responseComplete(); facesContext.renderResponse(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(input != null) { input.close(); } } catch(IOException e) { e.printStackTrace(); } } }