primefaces を使用して Java EE で 2 GB を超えるファイルをアップロードしたいと考えています。一般的にはそれほど大したことではありませんが、少し問題があります。PrimeFaces の通常の方法は、ファイルをアップロードし、その UploadedFile-Object を取得し、そこから InputStream を取得してからディスクに書き込むことです。
しかし、ディスクの大きなファイルへの書き込みは、時間のかかる作業です。代わりに、アップロードされたファイルをファイル システムで見つけて、すべてのファイルを保存するフォルダーに移動したいと思います。ファイルの移動は時間を無駄にしないためです。
したがって、この質問 hereに従って、ファイルがそこに配置されるときに、PrimeFaces-Tmp-folder とサイズ制限を設定することがわかりました。これで、アップロードされたすべてのファイルがそのフォルダーに直接移動します。ポイントは、ユーザーがアップロードしている間、ディスク上にファイルがあり、後でファイルを作成しないということです。
ここまでは順調ですね。ファイルを特定して移動することができました (奇妙な名前ですが)。しかし、Primefaces Userguide (Page 187)を参照すると、この Tmp-Folder は内部で使用されているだけです。そして、Primefaces から UploadedFile-Object の内容を盗むことさえあります。私にはきれいな解決策ではないようです。
これを達成するためのヒントはありますか?
この質問も見ました。私のタイトルかもしれませんが、それは私が探しているものではありません.
編集:
コメントのため、いくつかのコード。最初に、fileUploadListener で UploadFile-Objects を収集しています。
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++;
}
EJB の 2 番目に、すべての UploadedFile-Object に対して copyFile を呼び出しています。
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);
}
}