【问题标题】:How to handle file uploads when other validation errors are thrown抛出其他验证错误时如何处理文件上传
【发布时间】:2014-04-30 23:48:07
【问题描述】:

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

关于如何解决这个问题的任何想法?上传的温度可以吗?文件被“保存在内存中”,例如视图 bean - 然后在其他字段的验证没有失败时“注入”回来?

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

【问题讨论】:

  • Sven Hasselbach 就该问题发表了 2 篇系列文章:hasselba.ch/blog/?p=1019
  • Oliver,只是为了确保我理解您的建议:我可以使用 Sven 的想法来禁用其他字段的验证,对吗?但是我仍然需要验证其他字段...
  • 是的,它在使用文件上传和删除操作时禁用其他字段的验证。您也可以尝试仅保存文档 onChange - 可能作为临时文档(它的标志字段在验证后“真实”保存后被删除。
  • 在 ND9 中,IBM 改变了一些内部对象,这就是为什么这个技巧只适用于 Domino
  • 我不知道XPages,但大体思路是把上传的文件保留在服务器上,并添加一个包含指向文件的指针的隐藏字段。它可能是临时文件的部分路径。这是 Ruby on Rails 中的一个示例,但在 XPages 中也必须如此:github.com/carrierwaveuploader/…

标签: java validation file-upload xpages


【解决方案1】:

您应该更改您的 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 文件上传进度结合起来,这将为用户提供更好的用户体验。

【讨论】:

  • 斯文,我很欣赏你的想法。但是,它会给我一种完全不同的方法 - 以及在上传文件之前验证文件的方法。您的想法类似于 Mark Leusink 创建的文件上传组件 - 我考虑过但出于相同的原因在这种情况下离开了。
【解决方案2】:

好的,我只想简要介绍一下我最终解决此问题的方式。

首先要注意的是文件是在任何验证器运行之前上传的。它被放置在 Domino 数据库中一个名为 xspupload 的目录中 - 该文件获得了一个没有文件后缀的“晦涩”名称。

但是,我可以获取该文件(我将文件上传控件映射到托管 bean 中的 com.ibm.xsp.component.UIFileuploadEx.UploadedFile 类型的对象)。为该对象设置值后,我可以通过调用控件的 getUploadedFile() 来获取上传的文件,这将返回一个类型为:com.ibm.xsp.http.UploadedFile 的对象。这个文件对象有一个 getClientFileName() 和 getServerFile() 可以用来找出用户上传的文件和临时文件。将其重命名为另一个名称。如果您不重命名它,那么它会在 http 请求完成后自动删除。所以你必须记住在完成后重命名(或删除)文件(我从中找到了一些灵​​感:http://www.bleedyellow.com/blogs/m.leusink/entry/processing_files_uploaded_to_an_xpage?lang=en)。

然后我会记住温度。绑定到我的 bean 中的字符串值的简单隐藏输入字段中的文件的文件名。这样页面就知道它已被上传,我可以向用户显示名称(通过隐藏正常的文件上传控件并提供我自己的图标,该图标将显示任何“待定名称”并在单击时“单击”本机控件) .

这样我可以保留文件并将其与其他字段一起保存并验证它。即使在我这样做的重复控制中。

但是,唉,没有简单的“开箱即用”解决方案。您必须自己编写代码(或使用 Sven 建议的以客户为中心的方法)。

感谢您的意见。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多