2013-01-08 12 views
12

Ich lade eine Datei in JSF hoch. Ich verwende dafür Tomahawk <t:inputFileUpload>, aber die gleiche Frage gilt z. PrimeFaces <p:fileUpload> und JSF 2.2 <h:inputFile>.So speichern Sie die hochgeladene Datei in JSF

Ich habe den unten Backing Bean Code:

private UploadedFile uploadedFile; // +getter+setter 

public String save() throws IOException { 
    String name = uploadedFile.getName(); 
    System.out.println("File name: " + name); 

    String type = uploadedFile.getContentType(); 
    System.out.println("File type: " + type); 

    long size = uploadedFile.getSize(); 
    System.out.println("File size: " + size); 

    InputStream stream = uploadedFile.getInputStream(); 
    byte[] buffer = new byte[(int) size]; 
    stream.read(buffer, 0, (int) size); 
    stream.close(); 
} 

Ich kann die Dateinamen, Typen und Größe bekommen, aber ich bin nicht in der Lage diese Datei auf einem bestimmten Pfad zu speichern. Ich kann nicht herausfinden, wie die hochgeladene Datei ordnungsgemäß gespeichert wird. Wie kann ich das erreichen?

+0

fügen Sie weitere details.post vollständigen Code –

+0

@Abin ich bearbeitet mit Code, ich bekomme Name der Datei, aber wie kann ich es hochladen ot Server, Sie wissen es? –

+0

Sie verwenden MyFaces..Richtig? –

Antwort

43

Die Methode getInputStream() der hochgeladenen Datei repräsentiert den Dateiinhalt.

InputStream input = uploadedFile.getInputStream(); 

Sie müssen es in eine Datei kopieren. Sie sollten zuerst einen Ordner auf dem lokalen Dateisystem vorbereiten, in dem die hochgeladenen Dateien gespeichert werden sollen. Zum Beispiel /path/to/uploads (unter Windows wäre das auf der gleichen Festplatte wie auf dem Server). Beachten Sie, dass Sie absolut nicht die Dateien im erweiterten WAR-Ordner mit einem relativen Pfad oder getRealPath() aus den hier genannten Gründen Uploaded image only available after refreshing the page speichern sollten.

Dann müssen Sie den Dateinamen automatisch generieren. Andernfalls, wenn jemand anderes eine Datei mit zufällig demselben Namen später hochlädt, würde sie überschrieben werden. Sie könnten die Funktion Files#createTempFile() verwenden, um einen automatisch generierten Dateinamen zu erhalten.

Path folder = Paths.get("/path/to/uploads"); 
String filename = FilenameUtils.getBaseName(uploadedFile.getName()); 
String extension = FilenameUtils.getExtension(uploadedFile.getName()); 
Path file = Files.createTempFile(folder, filename + "-", "." + extension); 

Der Weg zum Uploads könnte, wenn notwendig, in diesem Q & A gezeigt, basierend auf einem von mehreren Wegen parametriert werden: Recommended way to save uploaded files in a servlet application. Die FilenameUtils ist Teil von Apache Commons IO, die Sie bereits in Ihrem Klassenpfad haben sollten, da es eine Abhängigkeit von der Tomahawk-Datei-Upload-Komponente ist.

Schließlich streamen nur die hochgeladene Datei zu dieser Datei (unter der Annahme, Java 7):

try (InputStream input = uploadedFile.getInputStream()) { 
    Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING); 
} 

System.out.println("Uploaded file successfully saved in " + file); 

Dann es zurück zum Download, am einfachsten /path/to/uploads als neuen Webapp Kontext oder ein virtuelles Host zu registrieren wäre so dass alle diese Dateien über eine URL verfügbar sind. Siehe auch Load images from outside of webapps/webcontext/deploy folder using <h:graphicImage> or <img> tag.

+0

danke, Und wenn ich mehrere Dateien auf einmal auswählen möchte, dann Was muss ich bevorzugen? –

+2

Das ist nicht möglich mit '' das erzeugt ein einfaches altes HTML4 ''. Das geht nur mit Flash oder HTML5 ''. RichFaces und PrimeFaces bieten solche Komponenten an. Z.B. http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=fileUpload&skin=blueSky und http://www.primefaces.org/showcase/ui/fileUploadMultiple.jsf – BalusC

+0

Danke, Entschuldigung für mehr und mehr Fragen , aber jede andere Möglichkeit mit ? –

Verwandte Themen