2009-10-22 21 views
8

Attualmente sto cercando di caricare alcuni file utilizzando Java Server Faces. Ho trovato this great introduction usando RichFaces. Tuttavia, ho alcuni problemi a capire il processo qui.Caricamento file utilizzando RichFaces

Prima l'utente seleziona un file e se il caricamento immediato è impostato su true il file viene elaborato utilizzando ajax, finora tutto bene. Quando si tratta di fase successiva però, l'ascoltatore sul Bean lato la seguente mi confonde:

public void listener(UploadEvent event) throws Exception{ 
    UploadItem item = event.getUploadItem(); 

    File f = item.getFile(); 

    System.out.println(f.getAbsolutePath()); 
} 

Il percorso assoluto è in una directory temporanea sul mio computer, sicuro di aver capito che, ma come si farebbe il file disponibile per la webbapplication? La mia applicazione è distribuita come un file WAR. È possibile caricarlo in WAR? Potrebbe sembrare stupido o così, ma potrebbe davvero essere utile.

Sono perfettamente consapevole che posso rinominare il file per copiarlo in una nuova posizione, ma è così che va?

risposta

5

Scrivere cose nella directory WAR (supponendo che WAR sia persino esploso come directory) è, in generale, una cattiva idea (per gli stessi motivi per cui l'archiviazione dei dati nella directory dell'applicazione è di solito una cattiva idea).

Probabilmente vorrai che finisca in un archivio di persistenza, di solito un database. Esattamente come tu gestisci che dipende da te: se usi il file system e memorizzi un riferimento nel database o memorizzi un BLOB nel database direttamente e se usi JDBC o JPA o Hibernate, ecc.

L'elenco di i file caricati potrebbero quindi essere letti dal database aggiornando il pannello che li conteneva usando qualcosa come <a4j:support event="onuploadcomplete" reRender="info" />.

Un servlet per il download di file (se RichFaces non ne possiede uno) è abbastanza semplice da scrivere.

+0

come pensavo, grazie per chiarire in su. Credo che dovrò cercare di creare un servlet di download. –

+0

Hai mai capito come creare il servlet di download, Filip? Ho giocato con il componente fileUpload e non riesco, per tutta la vita, a capire dove va un file dopo averlo caricato. – MattSayar

5

Non so quanto aiuto sia (e probabilmente troppo tardi!), Ma questo è il codice che uso sul lato server, equivalente al listener.

public String uploadFile(UploadEvent event) { 
    UploadItem item = event.getUploadItem(); 

    String name = "unnamed_attachment"; 
    byte[] data = item.getData(); 

    try { 
     name = FilenameUtils.getName(item.getFileName()); 
     data = FileUtils.readFileToByteArray(item.getFile()); 
     logger.info("data.length = " + data.length); 
     UploadDetails details = new UploadDetails(); // This is a javabean that gets persisted to database (actually a ejb3 entity bean, but thats irrelevant) 

     details.setBytes(data); 
     details.setResume(true); 
     // Save to database here 

    } catch (Exception e) { 
     FaceletsUtil.addSystemErrorMessage(); 
     logger.error(e, e); 
    } 
    return null; 
} 

La grande domanda che rimane è che dici "Come si rendere disponibile il file per il webbapplication?". L'array di byte è immediatamente disponibile. Se volete scaricare nuovamente il file, è possibile fornire come un link ad un metodo in una sessione di JSF/vista di fagioli come:

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

public void downloadFile() { 
    final HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

    response.setHeader("Content-Disposition", "attachment;filename=radar-report" + new Date() + ".pdf"); // or whatever type you're sending back 
    try { 
     response.getOutputStream().write(uploadDetails.getBytes()); // from the UploadDetails bean 
     response.setContentLength(uploadDetails.getBytes().length); 
     response.getOutputStream().flush(); 
     response.getOutputStream().close(); 
    } catch (IOException e) { 
     logger.error(e, e); 
    } 
    FacesContext.getCurrentInstance().responseComplete(); 
} 
Problemi correlati