2009-10-22 52 views
8

Şu anda Java Server Faces kullanarak bazı dosya yüklemelerini arıyorum. RichFaces kullanarak this great introduction buldum. Ancak, burada süreci anlamakta bazı sıkıntılarım var.RichFaces kullanarak dosya yükleme

İlk önce kullanıcı bir dosya seçer ve anında karşıya yükleme true olarak ayarlanırsa dosya ajax kullanılarak işlenir, bu kadar iyi. bununla birlikte bir sonraki adıma gelince, Fasulye tarafında dinleyici şu beni karıştırır:

Mutlak yol bilgisayarımda bir geçici dizin etmektir
public void listener(UploadEvent event) throws Exception{ 
    UploadItem item = event.getUploadItem(); 

    File f = item.getFile(); 

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

, ben emin anlıyorum, ama nasıl yapacak dosya, web uygulaması için kullanılabilir mi? Uygulamam bir WAR dosyası olarak dağıtıldı. Bunu savaşa yüklemek mümkün mü? Sesli aptalca olabilir, ama aslında kullanışlı olabilir.

Dosyayı yeni bir konuma kopyalamak için yeniden adlandırabileceğimin tamamen farkındayım, ancak bu şekilde mi gidiyorsunuz?

cevap

5

WAR dizininize bir şeyler yazmak (WAR'ın bir dizin olarak bile patlatılmış olduğunu varsayarak), genellikle kötü bir fikirdir (verilerinizi uygulama dizininizde saklamanızın nedenleri genellikle kötü bir fikirdir).

Muhtemelen bir veritabanında, genellikle bir veritabanında sonuçlanmasını istersiniz. Tam olarak bunu nasıl idare edeceğiniz - dosya sistemini kullanıp veritabanında bir referansı saklamanız veya veritabanında doğrudan bir BLOB depolamanız ve JDBC veya JPA veya Hibernate, vb. Kullanmanız olup olmadığına bakmaktır.

Yüklenen dosyalar, <a4j:support event="onuploadcomplete" reRender="info" /> gibi bir şey kullanarak bunları içeren paneli yenileyerek veritabanından okunabilir.

Bir dosya indirme sunucusu uygulaması (RichFaces'ın yoksa) yazmak oldukça kolaydır.

+0

ben onu temizlemek için, teşekkürler düşündüğüm gibi. Sanırım bir indirme sunucusu oluşturmaya bakmam gerekecek. –

+0

Bu indirme sunucusunu nasıl oluşturacağınızı hiç anladınız mı Filip? FileUpload bileşeni ile oynadım ve bir dosya yükledikten sonra nereye gideceğimi anlayamıyorum. – MattSayar

5

Bunun ne kadar yardımcı olduğundan (ve muhtemelen çok geç!) Emin değilsiniz, ancak bu, sunucu tarafında kullandığınız ve dinleyicinize eşdeğer olan koddur.

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; 
} 

diyorsunuz kalan büyük soru "nasıl webbapplication dosya kullanılabilir hale ki?". Bayt dizisi hemen kullanılabilir. Dosyayı yeniden indirmek isterseniz, aşağıdaki gibi bir JSF oturum/görünüm fasulye bir yönteme bir bağlantı olarak bunu sağlayabilir:

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