21

JSFでファイルをアップロードしています。これには Tomahawk を使用して<t:inputFileUpload>いますが、同じ質問が PrimeFaces<p:fileUpload>や JSF 2.2 などにも当てはまります<h:inputFile>

以下のバッキング Bean コードがあります。

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

ファイル名、タイプ、およびサイズを取得できますが、このファイルを特定のパスに保存できません。アップロードしたファイルを保存する適切な方法がわかりません。どうすればこれを達成できますか?

4

2 に答える 2

59

アップロードされたファイルのgetInputStream()メソッドは、ファイルの内容を表します。

InputStream input = uploadedFile.getInputStream();

ファイルにコピーする必要があります。最初に、アップロードされたファイルを保存するローカル ディスク ファイル システム上のフォルダーを準備する必要があります。たとえば、/path/to/uploads(Windows では、サーバーが実行されているのと同じディスク上にあります)。ハードコードされたパスまたは Web 相対パスを使用して、またはここで説明した理由により、展開された WAR フォルダーまたは IDE プロジェクトのフォルダーにファイルを保存しないくださいgetRealPath()

次に、ファイル名を自動生成する必要があります。そうしないと、後で誰かが偶然同じ名前のファイルをアップロードしたときに上書きされてしまいます。機能を使用Files#createTempFile()して、自動生成されたファイル名を取得できます。

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

アップロードへのパスは、必要に応じて、この Q&A:アップロードされたファイルをサーブレット アプリケーションに保存するための推奨される方法 に示されているいくつかの方法のいずれかに基づいてパラメーター化できます。これFilenameUtilsは Apache Commons IO の一部であり、これは Tomahawk ファイル アップロード コンポーネントの依存関係であるため、クラスパスに既に含まれている必要があります。

最後に、アップロードされたファイルをそのファイルにストリーミングするだけです (Java 7 を想定)。

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

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

次に、それをダウンロードして戻すには/path/to/uploads、新しい webapp コンテキストまたは仮想ホストとして登録して、これらのすべてのファイルを URL で利用できるようにするのが最も簡単です。<h:graphicImage> または <img> タグを使用して webapps / webcontext / deploy フォルダーの外部から画像を読み込むも参照してください。

于 2013-01-08T11:44:15.860 に答える