13

Netbeans を使用した開発では、Primefaces の単純なファイル アップロードを使用します。私のテスト例は、Primefaces マニュアルに似ています。
私の質問: ファイルはローカル コンピューターのどこにアップロードされますか? どうすればパスを変更できますか? どうも!

jsf ファイル:

<?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>

およびマネージド 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;

    }
}
4

2 に答える 2

21

デフォルトでは、ファイル サイズと Apache Commons FileUpload 構成に応じて、サーブレット コンテナーのメモリまたは一時フォルダーに保存されます ( PrimeFaces ユーザー ガイド<p:fileUpload>の章の「フィルター構成」セクションも参照してください)。

これについてはまったく心配する必要はありません。サーブレット コンテナーと PrimeFaces は、自分が何をするかを正確に認識しています。コマンド ボタンのアクション メソッドで、アップロードされたファイルの内容を必要な場所に実際に保存する必要があります。アップロードされたファイルの内容をInputStreambyUploadedFile#getInputStream()またはbyte[]byとして取得できますUploadedFile#getContents()(大きなファイルの場合、取得するbyte[]と潜在的にメモリが高価になります。ご存知のように、それぞれbyteが JVM のメモリを 1 バイト消費するため、大きなファイルの場合は実行しないでください)。 .

例えば

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

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そしてIOUtils、Commons IO からのものであり、作業を開始するために既にインストールされている必要があります<p:fileUpload>)

一意のファイル名を生成するには、File#createTempFile()機能が役立つ場合があります。

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);
// ...
于 2012-08-06T14:20:03.210 に答える