2012-08-06 9 views
10

Ich benutze den einfachen Datei-Upload von Primefaces in Entwicklung mit Netbeans. Mein Testbeispiel ist ähnlich dem Primefaces-Handbuch.
Meine Frage: Wo wird die Datei auf meinem lokalen Computer hochgeladen? Wie kann ich den Pfad dafür ändern? Danke!Wo wird die p: fileUpload hochgeladene Datei gespeichert und wie kann ich sie ändern?

Die JSF-Datei:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 
    <h:head> 
     <title>Page test</title> 
    </h:head> 
    <h:body> 
     Hello! My first JSF generated page! 
     <h:form enctype="multipart/form-data"> 
      <p:fileUpload value="#{fileBean.file}" mode="simple" /> 
      <p:commandButton value="Submit" ajax="false"/> 
     </h:form> 

    </h:body> 
</html> 

und die Managed Bean:

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import org.primefaces.event.FileUploadEvent; 
import org.primefaces.model.UploadedFile; 


    @ManagedBean 

@RequestScoped 
public class FileBean { 

    private UploadedFile file; 

    public FileBean() { 
    } 

    public UploadedFile getFile() { 
     return file; 
    } 

    public void setFile(UploadedFile file) { 
     this.file = file; 

    } 
} 

Antwort

18

Es standardmäßig entweder in den Speicher des Servlet-Container oder dem temporären Ordner gespeichert ist, abhängig von der Dateigröße und die Apache Commons FileUpload-Konfiguration (siehe auch Abschnitt "Filterkonfiguration" des <p:fileUpload>-Kapitels in PrimeFaces User's Guide).

Sie sollten sich darüber überhaupt keine Sorgen machen. Der Servlet-Container und PrimeFaces wissen genau, was sie tun. Sie sollten in der Befehlsschaltfläche der Aktionsmethode tatsächlich den Inhalt der hochgeladenen Datei an dem Speicherort speichern, wo Sie benötigen. Sie können den Inhalt der hochgeladenen Datei als von UploadedFile#getInputStream() oder als byte[] von UploadedFile#getContents() erhalten (eine byte[] bekommen ist potenziell Speicher teuer im Falle von großen Dateien, wissen Sie, jeder byte isst ein Byte JVM Speicher, also tun Sie das nicht bei großen Dateien).

z.

<p:commandButton value="Submit" action="#{fileBean.save}" ajax="false"/> 

mit

private UploadedFile uploadedFile; 

public void save() throws IOException { 
    String filename = FilenameUtils.getName(uploadedFile.getFileName()); 
    InputStream input = uploadedFile.getInputStream(); 
    OutputStream output = new FileOutputStream(new File("/path/to/uploads", filename)); 

    try { 
     IOUtils.copy(input, output); 
    } finally { 
     IOUtils.closeQuietly(input); 
     IOUtils.closeQuietly(output); 
    } 
} 

(FilenameUtils und IOUtils sind von Commons IO, die Sie sollten ohnehin bereits um <p:fileUpload> zur Arbeit zu kommen installiert haben)

Um eindeutige Dateinamen zu generieren, Sie können File#createTempFile() Einrichtung hilfreich finden.

String filename = FilenameUtils.getName(uploadedFile.getFileName()); 
String basename = FilenameUtils.getBaseName(filename) + "_"; 
String extension = "." + FilenameUtils.getExtension(filename); 
File file = File.createTempFile(basename, extension, "/path/to/uploads"); 
FileOutputStream output = new FileOutputStream(file); 
// ... 
+0

Danke, ich schätze Ihre Hilfe! Ich habe die Logik davon und es hat einfach funktioniert. – seinecle

+1

Gern geschehen. – BalusC

-1

I verwendet einfachen Modus, Glassfish 4.0 und PrimeFaces 4.0

Backing Bean

private UploadedFile file; 
private String destination="C:\\temp\\"; 

public void upload() { 

    System.out.println("uploading"); 
    if(file != null) { 
     System.out.println("the file is" +file); 
     FacesMessage msg = new FacesMessage("Succesful" + file.getFileName() + " is uploaded."); 
     FacesContext.getCurrentInstance().addMessage(null, msg); 

     try { 
      copyFile(file.getFileName(), file.getInputstream()); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    System.out.println("uploaf finished"); 
} 

public void copyFile(String fileName, InputStream in) { 
    try { 
     // write the inputStream to a FileOutputStream 
     OutputStream out = new FileOutputStream(new File(destination + fileName)); 

     int read = 0; 
     byte[] bytes = new byte[1024]; 

     while ((read = in.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 

     in.close(); 
     out.flush(); 
     out.close(); 

     System.out.println("New file created!"); 
    } catch (IOException e) { 
     System.out.println(e.getMessage()); 
    } 
} 

JSF Seite

<p:commandButton value="Submit" ajax="false" actionListener="#{staffController.upload}"/> 
Verwandte Themen