これが私がすべてのブラウザで動作すると私が信じていることになったものです:
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;
}-*/;