2

私は自分のウェブサイドのユーザーに複数のプロパティを有効にしようと必死になっています。ユーザーは、各ファイルを個別に選択しなくても、大量のPDFファイルをサーバーにアップロードできるはずです。アップロードにgwt-uploadを使用しています。悲しいことに

MultiUploader

実際には、ユーザーが一度に複数のファイルを選択できるわけではありませんが、すべてのファイルの[参照]ボタンをもう一度クリックして、ブラウザーで選択する必要があります。

調べてみると、こんなものが必要だと気づきました

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

gwt-uploadから作成された入力に「複数」のプロパティを設定すると、ファイルダイアログを開いて複数のファイルを選択できるようになりますが、アップロードが開始/機能しなくなります。

gwtで複数ファイル入力を使用した例は見つかりませんでした。アップロードロジック全体を自分で実装したくないので、 gwt-uploadでこれを行う方法があれば完璧です!

どうもありがとう!

4

3 に答える 3

0

解決策は非常に簡単です。gwt-uploadには、複数のアップロードを実行できるUploaderクラスがあります。gwt-uploadのwikiで提案されているサーブレットコードは、すでに複数のアップロードを処理できます。

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())を、複数のプロパティを入力に設定するカスタムのものに置き換える必要があります。私は次のようなラッパークラスを使用します:

public class MyFileInput implements IFileInput {

    private final FileUpload fu;

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

あなたは明らかにIFileInputの他のメソッドを実装する必要があります、私はそれらをすべてfuにリンクしました。2つには同等の方法はありませんでしたが、私はそれらを使用しないので、ここでは問題ありません...

于 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 に答える
0

私はもっ​​と単純な解決策を使います。

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