我有以下要求: 我们有一个页面,要求用户将一些数据输入到由各种输入字段和下拉列表组成的表单中。 特别的是,imho,在这种形式下是fileupload的一部分。用户应该能够上传一些(多个)文件。然后,当他/她在页面末尾按下提交时,应将整个输入提交并写入对象。在此对象中,还必须保存上载文件的路径。 我想用primefaces'(3.4)组件实现文件上传。
现在我的挑战: fileUpload需要自己的h:form,其enctype为“multipart / form-data”。其他数据在“正常”范围内。 对我来说,这意味着我必须将表单放在页面中。但fileUpload组件应显示在另一种形式的中间。
我怎样才能做到这一点? 有什么想法吗?
祝你好运, 弗洛里安
答案 0 :(得分:4)
现在我的挑战:fileUpload需要自己的h:form,其中包含enctype“multipart / form-data”。其他数据在“正常”范围内。对我来说,这意味着我必须将表单放在页面中。
这实在是没有意义。我不确定你是怎么得出这个结论的。也许你基于对问题的错误观察得出结论。也许您使用了错误的bean作用域,并在处理表单提交时遇到所有到目前为止输入的输入和先前上载的文件的空值。如果您希望生成相同的bean实例,只要您通过多个ajax请求与同一视图进行交互,就应该使用@ViewScoped
。
您可以使用<h:inputText>
编码以完全相同的形式将multipart/form-data
等“普通”输入字段完美地放置。使用此编码,HTTP请求只是以稍微不同的格式发送,这允许二进制内容的空间。另请参阅params not getting passed to backing bean for h:commandLink under rich:popupPanel and t:dataList以获取详细的背景说明。
无关具体问题,我不确定如何解释
在此对象中,还必须保存上传文件的路径
但我想请注意,您绝对不能依赖发送到服务器的完整客户端文件路径。这只会在使用IE浏览器时由于该浏览器中的安全漏洞而发生。您应该对InputStream
或byte[]
的风格内容文件感兴趣。你应该自己生成一个具有唯一名称的(临时)文件,如果有必要的话,基于唯一的文件名(并确保第二个上传的文件具有相同的文件名不会覆盖它)。另请参阅How to get the file path from HTML input form in Firefox 3