2010-08-06 6 views
14

qui est le bon moyen de télécharger un fichier en utilisant JSF ?, juste en mettant un lien vers le fichier ?? dans ce cas, comment puis-je obtenir l'URL du fichier?Télécharger un fichier avec JSF?

j'ai vu un exemple en utilisant BufferedInputStream:

Quelles sont les différences?

Merci

Répondre

23

Si c'est un simple fichier, placez juste à webcontent publique (là où vous mettez vos fichiers statiques et JSF) et de créer un lien.

<h:outputLink value="/files/file.ext">link</h:outputLink> 

Le servletcontainer s'inquiète de l'application des en-têtes appropriés.

S'il est situé en dehors de la webcontent publique pour des raisons spécifiques (par exemple dans un chemin fixe à la machine serveur ou dans une base de données), puis créer une servlet qui obtient un InputStream de celui-ci et écrit à la OutputStream de la réponse au moins les en-têtes Content-Type, Content-Disposition et . Vous pouvez trouver here un exemple de coup d'envoi simple. Aussi cela peut simplement être lié sur url-pattern du servlet.

S'il est à généré dynamiquement et en fonction des paramètres de la requête spécifique JSF, vous pouvez aussi le faire dans une action de haricot géré qui est lié par h:commandLink ou h:commandButton, mais vous ne devez vous assurer que vous appelez FacesContext#responseComplete() à la fin de la méthode d'action de bean pour empêcher JSF de prendre la navigation dans les mains. Le même type de code de servlet peut être réutilisé pour diffuser le fichier. Vous pouvez trouver un exemple de coup d'envoi dans this answer.

+0

Oo Thx BalusC je ne pouvais pas se connecter à tous le week-end, mais je dois vous remercier pour toute votre aide = D J'apprécie vraiment – ErVeY

+0

De rien. – BalusC

12

je devais faire un code similaire pour télécharger un fichier via JSF

C'est mon bouton de téléchargement dans ma page JSF

<h:commandButton value="Download" action="#{helloBean.downloadFile}" /> 

Et il est mon code 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(); 
     } 
    } 

} 
+2

La méthode d'action du bouton de commande ne doit-elle pas renvoyer une chaîne? – codingsplash

+0

Ce n'est pas nécessaire –

-1

Je eu une erreur sur

FacesContext.getCurrentInstance().getResponseComplete(); 

du type

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

et je l'ai résolu:

page JSF:

<h:commandButton action="#{bean.downloadFile}" id="downloadBtn" value="Download"/> 

méthode Bean:

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(); 
     } 
    } 
} 
+0

J'ai dit essayer parce que je n'ai pas eu le temps de bien l'expliquer et le titre du message est [Télécharger un fichier avec JSF?].Et je l'ai testé et cela fonctionne donc si vous n'avez pas testé s'il vous plaît ne dites pas que je pense ... –

Questions connexes