java - 用于 GWT 的 Moxieapps 文件 uploader 添加多个上传按钮

标签 java gwt file-upload

我正在构建的 GWT Web 应用程序有一个页面,用户可以在其中上传 CSV 文件。上传代码使用Moxieapps GWT Uploader ,大多数情况下效果很好。

但是,我发现了一个奇怪的情况,离开该页面然后返回该页面会再次添加上传按钮。所以我第三次访问该页面时,上传部分将如下所示:

enter image description here

在检查器中查看生成的 HTML 的相关部分显示,包含“按钮”的 inputdiv 都被一遍又一遍地添加(尽管有只存在一个拖放区):

enter image description here

我已经多次检查我的代码,看看我是否做了一些可能导致此问题的事情,但没有找到任何结果。您实际上并不手动添加按钮或输入;而是手动添加按钮或输入。这是由框架自动完成的。 fileUploader 仅初始化一次(这是 GWT 客户端代码,我已使用检查器进行调试并将语句记录到控制台以确认这一点):

fileUploader.setButtonDisabled(true).setFileTypes("*.csv")
    .setUploadURL(getBaseUrl() + "/fileUpload.upload")
    .setButtonText("<span class=\"buttonText\">Select CSV file to upload</span>")
    .setFileSizeLimit(FILE_SIZE_LIMIT)
    .setButtonCursor(CustomUploader.Cursor.HAND)
    .setButtonAction(CustomUploader.ButtonAction.SELECT_FILE)
    .setUploadProgressHandler(new UploadProgressHandler() {...})
    .setUploadSuccessHandler(...)
    // etc. with other handlers

从其他几个地方调用方法 setButtonText() ,并且文本会按预期更改,但仅在最后一个按钮上(如果有多个按钮)。否则,据我所知,我的代码中没有任何内容可以添加按钮。

还有其他人遇到过这个问题吗?我需要设置一些属性来防止这种情况吗?这可能是 moxieapps 代码中的错误吗?

最佳答案

写出我的问题并添加“这可能是 moxieapps 代码中的错误吗?”最后,我对这个怀疑进行了跟进,事实证明这确实是 org.moxieapps.gwt.uploader.client.Uploader 类中的一个错误。

input 和“选择文件”按钮添加到该类的 onLoad() 方法中,而不检查它们是否已添加。

看起来这个框架已经有一段时间没有任何积极的开发了,所以我认为是时候创建一个自定义覆盖版本了。我已经测试过了,它有效:

package yourpackagename.client.override;

import java.util.Iterator;

import org.moxieapps.gwt.uploader.client.Uploader;

import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.WidgetCollection;

/**
 * The sole reason this class exists is to fix a bug in the moxieapps uploader
 * (org.moxieapps.gwt.uploader-1.1.0.jar) where it adds a new upload input and
 * button each time its <code>onLoad()</code> method is called, i.e. every time
 * you navigate away from the page and then back to it.
 */
public class CustomUploader extends Uploader {
    @Override
    protected void onLoad() {
        boolean hasFileUploadAlready = false;
        WidgetCollection children = getChildren();
        for (Iterator<Widget> iterator = children.iterator(); iterator.hasNext();) {
            Widget eachWidget = iterator.next();
            if (eachWidget instanceof FileUpload) {
                hasFileUploadAlready = true;
            }
        }
        // Only call the super method if there isn't already a file upload input and button
        if (!hasFileUploadAlready) {
            super.onLoad();
        }
    }
}

我没有引用 org.moxieapps.gwt.uploader.client.Uploader,而是更改了引用以指向我的自定义 uploader 类,该类现在将检查现有的 FileUpload 子窗口小部件,如果找到这样的窗口小部件,则只需跳过原始 onLoad() 代码即可。

可能有点像 pry 棍方法,但它有效(就我而言,更改 maven 管理的 JAR 文件不太实用)。希望这对遇到此问题的其他人有用。

关于java - 用于 GWT 的 Moxieapps 文件 uploader 添加多个上传按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35305909/

相关文章:

java - 我可以使用 Amazon 高级或低级 API 暂停和恢复分段上传吗?

java - 始终等待页面加载到 PageObjects 上

python - 使用HTTPS的网站,通过POST上传的文件是否加密?

java - 使用 eclipse 从选定的 java 文件创建 jar 文件

java - GWT 从小程序调用 JS 方法

java - GWT 2.4 IE8 问题

java - GWT 中的海量数据网格

javascript - 如何在上传目录时删除 Chrome 中的警告消息

Java聊天客户端和服务器

java - Java 中的 HashMap