1

Play Framework 2(Java)を使用してファイルのアップロードを実装しようとしています

これを行うために、私は次のガイドに従いました:http ://www.playframework.org/documentation/2.0/JavaFileUpload

サーバー側では、MultipartFormDataで常にMissingFilePartのオブジェクトを取得します。

これは私の見解です:

@form(action = routes.ImmediateCollections.savePoliceReport, 'enctype -> "multipart/form-data") {
    <fieldset>
        <div class="fileupload fileupload-new">
            <span class="btn btn-file">
                <span class="fileupload-new">Select file</span>
                <span class="fileupload-exists">Change</span>
                <input type="file" name="policeReportFile" id="policeReportFile"/>
            </span>
            <span class="fileupload-preview"></span>
            <a href="#" class="close fileupload-exists" style="float: none">×</a>
        </div>
    </fieldset>
    @controls {
        @submitbutton()
    }
}

これにより、次のhtmlが生成されます。

<form action="/immediatecollections/save-policereport" method="POST" enctype="multipart/form-data">
    <fieldset>
        <div class="fileupload fileupload-new">
            <span class="btn btn-file">
                <span class="fileupload-new">Select file</span>
                <span class="fileupload-exists">Change</span>
                <input type="file" name="policeReportFile" id="policeReportFile">
            </span>
            <span class="fileupload-preview"></span>
            <a href="#" class="close fileupload-exists" style="float: none">×</a>
        </div>
    </fieldset>
    <div class="control-group">
        <div class="controls">
            <input type="submit" class="btn btn-success" value="Save">
        </div>
    </div>
</form>

(スパンとdivについて疑問に思っている人のために、私は優れたjasnyブートストラップ拡張機能を使用しています。)

入力フィールドが1つしかないことに注意してください。このフォームは、1つのファイルをアップロードするという1つの目的にのみ役立ちます。

これは私のコントローラーです:

public static Result savePoliceReport() {
    Http.MultipartFormData formData = request().body().asMultipartFormData();
    Http.MultipartFormData.FilePart policeReportFile = formData.getFile("policeReportFile");
    if (policeReportFile != null) {
        // move file to somewhere
        // save metadata to database

        // for simplicity's sake: return json success = true or false
        ObjectNode jsonResult = Json.newObject();
        jsonResult.put("success", true);
        return ok(jsonResult);
    } else {
        ObjectNode jsonResult = Json.newObject();
        jsonResult.put("success", false);
        return badRequest(jsonResult);
    }
}

このメソッドは、routesファイルで次のように定義されています。

POST    /immediatecollections/save-policereport     controllers.ImmediateCollections.savePoliceReport

これで、ファイルをアップロードしてサーバー側でデバッグすると、これがリクエストとして取得されます。

サーバー側のデバッグ

これを正しく読んでいると、ファイルの内容が欠落していると表示されます。どうしたの?バイトは送信中に失われましたか?何かが失敗した場合、Playが例外をスローしなかったのはなぜですか?

ChromeとInternetExplorerの両方でこれを試しましたが、どちらの場合も同じ結果になりました。

私は何が間違っているのですか?ありがとう!

4

2 に答える 2

1

これは最終的に Google グループで解決されました。そこから回答を再投稿します。

ジェームズ・ローパー:

MissingFilePart は、マルチパート データのファイル名フィールドが空の場合にスローされます (名前は少し誤解を招きます)。ブラウザーが空のファイル名を送信する理由は興味深い質問です。Chrome 開発ツールの [ネットワーク] タブで、小さな (数バイトのみ) ファイルをアップロードして、リクエストの本文を確認していただけますか? リクエスト本文をここに投稿できますか?次のようになります。

--AaB03x content-disposition: フォームデータ; 名前="写真"; filename="file1.txt" Content-Type: テキスト/プレーン

アップロードしたファイルの内容です --AaB03x--

ここでのもう 1 つの問題は、HTML 仕様ではクライアントがファイル名パラメーターを送信するために最善を尽くすことを奨励していますが、これは必須フィールドではないため、そこになくても Play が失敗することはないということです。

私の反応:

ファイル名がありませんでした。Jasny の JavaScript がどういうわけか入力要素を壊してしまったことが判明しました。時間がなかったので、派手なマークアップのない基本的な要素に置き換えただけです。これについては後で説明します。誰かが解決策を見つけたら、喜んでそれを聞きますが、今のところはそのままにしておきます。

返信ありがとうございます James、そのエラーを見つけるのにかなり時間がかかったでしょう。:-)

TLDR: 入力タグに name 属性がありませんでした

于 2013-02-27T15:38:02.440 に答える
0

奇妙に聞こえますが、例: http://www.playframework.com/documentation/2.0/JavaFileUpload も同じように失敗しますか?

于 2013-02-27T13:37:20.917 に答える