如何在抛出其他验证错误时处理文件上载

时间:2014-03-23 19:00:11

标签: java validation file-upload xpages

我有一个带有fileupload控件和一些字段的XPage。我使用服务器端验证(一些字段需要查找等来验证内容)。现在,如果用户指定要上载的文件并且其中一个字段无法验证(向用户显示消息),则fileupload控件将丢失其客户端名称(实际上是文件) - 这意味着用户必须选择该文件再次上传。

关于如何解决这个问题的任何想法?可以上传临时。文件是"保存在内存中#34;在例如视图bean - 然后"注入"当验证对其他字段没有失败时返回?

这个问题与此处提出的问题有关:How can I "keep" the uploaded image on a form validation error? - 它没有给出上述解决方案(尽管讨论了临时文件)。

2 个答案:

答案 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建议的以客户为中心的方法)。

感谢您的意见。