我有一个带有fileupload控件和一些字段的XPage。我使用服务器端验证(一些字段需要查找等来验证内容)。现在,如果用户指定要上载的文件并且其中一个字段无法验证(向用户显示消息),则fileupload控件将丢失其客户端名称(实际上是文件) - 这意味着用户必须选择该文件再次上传。
关于如何解决这个问题的任何想法?可以上传临时。文件是"保存在内存中#34;在例如视图bean - 然后"注入"当验证对其他字段没有失败时返回?
这个问题与此处提出的问题有关:How can I "keep" the uploaded image on a form validation error? - 它没有给出上述解决方案(尽管讨论了临时文件)。
答案 0 :(得分:0)
您应该更改UI并为用户提供一个特殊的按钮来上传他们的文件(可能在模态对话框中)。这是一个小例子XPage:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
<xp:dominoDocument var="document1" formName="RTItem" action="editDocument" concurrencyMode="force" />
</xp:this.data>
<xp:div id="refreshMe">
<xp:fileUpload id="fileUpload1" value="#{document1.Body}" />
<xp:button value="Upload File" id="buttonUpload">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete" disableValidators="true" />
</xp:button>
<!-- A download control to show the datasource -->
<xp:fileDownload rows="30" id="fileDownload1" displayLastModified="false" value="#{document1.Body}" />
<!-- A required field and a messages element -->
<xp:inputText id="inputText1" required="true" />
<xp:messages id="messages1" />
<!-- a button to refresh the page -->
<xp:button value="Refresh Me" id="buttonRefreshMe">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="refreshMe" />
</xp:button>
</xp:div>
</xp:view>
您可以将其与后台的AJAX文件上传程序进度结合起来,这将为用户提供更好的用户体验。
答案 1 :(得分:0)
好的,我只是想快速概述一下我最终解决这个问题的方法。
首先要注意的是,在运行任何验证程序之前上传文件。它被放置在Domino数据库中名为xspupload的目录中 - 该文件得到一个&#34;模糊&#34;名称没有文件后缀。
但是,我可以抓取这个文件(我将文件上传控件映射到托管bean中com.ibm.xsp.component.UIFileuploadEx.UploadedFile类型的对象)。当为该对象设置一个值时,我可以通过调用控件的getUploadedFile()来获取上传的文件,该控件将返回一个类型为com.ibm.xsp.http.UploadedFile的对象。该文件对象有一个getClientFileName()和getServerFile(),可用于查找用户上传的文件和temp。将其重命名为其他名称。如果您不重命名,则在http请求完成后将自动删除它。所以你必须记住在完成后重命名(或删除)文件(我在这里找到了一些灵感:http://www.bleedyellow.com/blogs/m.leusink/entry/processing_files_uploaded_to_an_xpage?lang=en)。
然后我记得那个温度。在我的bean中绑定到字符串值的简单隐藏输入字段中的文件的文件名。这样页面就知道它已被上传,我可以向用户显示名称(隐藏正常的文件上传控件并提供我自己的图标,显示任何&#34;待定名称&#34;&#34;点击& #34;单击时的本机控件)。通过这种方式,我可以暂停文件并保存 - 并验证它 - 以及其他字段。即使是在我重复控制的地方。
但是,唉,没有简单的&#34;开箱即用&#34;解。您必须自己编写代码(或使用Sven建议的以客户为中心的方法)。
感谢您的意见。