我拼命地试图向我的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;
}-*/;