用于GWT的Moxieapps文件上传器添加多个上传按钮

时间:2016-02-10 02:38:56

标签: java gwt file-upload

我建立的GWT网络应用程序有一个用户可以上传CSV文件的页面。上传代码使用的是Moxieapps GWT Uploader,其效果非常好。

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

enter image description here

在检查器中查看生成的HTML的相关部分显示inputdiv包含"按钮"反复添加(虽然只有一个dropzone):

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代码中的错误吗?

1 个答案:

答案 0 :(得分:1)

在写完我的问题后,添加“它可能是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,而是将引用更改为指向我的自定义上传器类,现在将检查现有的FileUpload子窗口小部件,并简单地跳过原始{{1}代码,如果它找到这样的小部件。

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