Wie verschiebe ich Primefaces-Upload-Temp-Files anstelle eines zeitintensiven Kopiervorgangs?

Ich möchte Dateien größer als 2 GB mit Java EE unter Verwendung von Primefaces hochladen. Im Allgemeinen ist das keine so große Sache, aber ich habe ein kleines Problem. Der übliche Weg bei PrimeFaces ist, eine Datei hochzuladen, das UploadedFile-Object zu haben, den InputStream daraus zu beziehen und dann auf die Festplatte zu schreiben.

Das Schreiben auf große Datenträgerdateien ist jedoch eine zeitintensive Aufgabe. Stattdessen möchte ich die hochgeladene Datei im Dateisystem suchen und dann in den Ordner verschieben, in dem ich alle Dateien speichere, da das Verschieben von Dateien keine Zeit verschwendet.

Also nachdiese Frage hier Ich habe herausgefunden, PrimeFaces-Tmp-Ordner und die Größenbeschränkung festzulegen, wenn Dateien dort abgelegt werden. Jetzt geht jede hochgeladene Datei direkt in diesen Ordner. Der Punkt ist, dass ich jetzt eine Datei auf der Festplatte habe, während der Benutzer die Datei hochlädt - und sie anschließend nicht erstelle.

So weit, ist es gut. Ich konnte die Datei identifizieren und einfach verschieben (obwohl sie einen seltsamen Namen hat). Aber darauf hinweisenPrimefaces-Benutzerhandbuch (Seite 187)Dieser Tmp-Ordner wird nur intern verwendet. Und ich würde sogar den Inhalt des UploadedFile-Objekts von Primefaces stehlen. Scheint für mich keine saubere Lösung zu sein.

Irgendwelche Tipps, wie man das erreicht?

Ich habe auch gesehendiese Frage. Könnte auch mein Titel sein, aber es ist nicht das, wonach ich suche.

BEARBEITEN:

Wegen des Kommentars etwas Code. Zuerst sammle ich die UploadFile-Objekte im fileUploadListener:

   public void handleFileUpload(FileUploadEvent event) throws IOException {
    FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
    FacesContext.getCurrentInstance().addMessage(null, msg);

    getUploadedFilesDTO().add(new UploadedFileDTO(event.getFile(), uploadedFilesCounter));
    uploadedFilesCounter++;

}

Als zweites im EJB rufe ich copyFile für jedes UploadedFile-Objekt auf:

private void copyFile(UploadedFile uploadedFile, String randomFilename) throws IOException {


    InputStream originalFile = uploadedFile.getInputstream();
    OutputStream fileOutput = null;

    try {
        fileOutput = new FileOutputStream("/pvtfiles/" + randomFilename);
        IOUtils.copy(originalFile, fileOutput);
    } finally {
        IOUtils.closeQuietly(fileOutput);
        IOUtils.closeQuietly(originalFile);
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage