使用GWT立即上传多个文件



我拼命地试图向我的Webside用户启用多专业。用户应该能够将一堆PDF文件上传到我的服务器,而无需单独选择每个文件。我正在使用GWT-UPLOAD进行上传。可悲的是

MultiUploader

实际上并不能一次让用户一次选择几个文件,但是您必须再次单击每个文件的"浏览" -Button,然后在浏览器中进行选择。

我研究并意识到我需要有类似的东西

<input name='uploads[]' type="file" multiple>

在GWT-upload创建的输入上设置"多个" - Property可以做到这一点,以至于打开的文件dialog让我可以选择几个文件,但是上传不再启动/工作。

>

我找不到使用GWT多文件输入的任何示例。如果有一种方法可以使用GWT-UPload进行此操作,那将是完美的,因为我真的不想再次自己实现整个上传逻辑!

非常感谢!

我使用更简单的解决方案。

defaultUploader = new MultiUploader();
IFileInput ctrl = defaultUploader.getFileInput();
DOM.setElementProperty((ctrl).getElement(), "multiple", "multiple");

解决方案非常简单。GWT-UPLOAD具有一个类上传器,可以进行多个上传。GWT-UPload的Wiki中建议的Servlet代码已经能够处理多个上传。

我不得不在上传器类中更改某些内容(源已完全可用,所以我只是复制了它并替换了所需的零件)。要访问所选文件的文件名和文件,我创建了一个简单的本机方法:

private static native String getFilesSelected() /*-{
    var count = $wnd.$('input:file')[0].files.length;
    var out = "";
    for (i = 0; i < count; i++) {
        var file = $wnd.$('input:file')[0].files[i];
        out += file.name + ';' + file.size + ";";
    }
    return out;
}-*/;

我分配的返回值;要获得所需的结果。

,您需要用自定义的fileinput(setFileInput())替换一个自定义的fileinput(setFileInput()),该自定义将多个属性设置为输入。我使用这样的包装类:

public class MyFileInput implements IFileInput {
    private final FileUpload fu;
    public MyFileInput() {
        fu = new FileUpload();
        DOM.setElementProperty(fu.getElement(), "multiple", "multiple");    
    }
}

您显然需要实现IfileInput的其他方法,我将它们全部链接到FU。两个没有等效的方法,但是我不使用它们,所以这里没有问题...

这是我最终得到的,我相信在所有浏览器上都可以使用:

form = new FormPanel();
form.setEncoding(FormPanel.ENCODING_MULTIPART);
form.setMethod(FormPanel.METHOD_POST);
form.add(new HTML("<input type='file' id='fileselect' name='fileselect[]' multiple />"));

然后在服务器端,我只是在使用" org.apache.commons.fileupload"。

是的,有些人可能不喜欢表格中的html元素,但是如果需要,您可以从中获取输入元素:

protected Element getFileSelectElement() {
    HashMap<String, Element> idMap = Maps.newHashMap();
    GuiUtil.parseIdsToMap(inputField.getElement(), idMap);
    Element input = idMap.get("fileselect");
    return input;
}
public static void parseIdsToMap(Element element, HashMap<String, Element> idMap) {
    int nodeCount = element.getChildCount();
    for (int i = 0; i < nodeCount; i++) {
        Element e = (Element) element.getChild(i);
        if (e.getId() != null) {
            idMap.put(e.getId(), e);
        }
    }
}

最后...如果您想访问用户在浏览器方面选择的文件列表,则是我所拥有的:

public static native String getFileNames(Element input) /*-{
    var ret = "";
    //microsoft support
    if (typeof (input.files) == 'undefined'
            || typeof (input.files.length) == 'undefined') {
        return input.value;
    }
    for ( var i = 0; i < input.files.length; i++) {
        if (i > 0) {
            ret += ",";
        }
        ret += input.files[i].name;
    }
    return ret;
}-*/;

相关内容

  • 没有找到相关文章

最新更新