2

我正在拼命地尝试为我的网站用户启用多重属性。用户应该能够将一堆 PDF 文件上传到我的服务器,而无需单独选择每个文件。我正在使用gwt-upload进行上传。可悲的是

MultiUploader

实际上并不允许用户一次选择多个文件,但您必须再次单击每个文件的“浏览”按钮并在浏览器中选择。

我研究并意识到我需要这样的东西

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

到目前为止,在从gwt-upload创建的输入中设置“多个”-属性可以使打开文件对话框让我选择多个文件,但是上传不再开始/工作。

我找不到任何使用带有 gwt 的多文件输入的示例。如果有办法用gwt-upload做到这一点,那将是完美的,因为我真的不想再自己实现整个上传逻辑!

非常感谢!

4

3 回答 3

0

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

defaultUploader = new MultiUploader();
IFileInput ctrl = defaultUploader.getFileInput();
DOM.setElementProperty((ctrl).getElement(), "multiple", "multiple");
于 2013-05-27T18:16:22.847 回答
0

解决方案非常简单。gwt-upload 有一个 Uploader 类,它可以进行多次上传。gwt-upload wiki 中建议的 servlet 代码已经能够处理多个上传。

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

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()) 替换为自定义的,它将 multiple 属性设置为输入。我使用这样的包装类:

public class MyFileInput implements IFileInput {

    private final FileUpload fu;

    public MyFileInput() {
        fu = new FileUpload();
        DOM.setElementProperty(fu.getElement(), "multiple", "multiple");    
    }
}

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

于 2012-10-26T08:32:56.720 回答
0

以下是我认为适用于所有浏览器的结果:

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;
}-*/;
于 2013-05-09T23:39:31.390 回答