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の両方でこれを試しましたが、どちらの場合も同じ結果になりました。
私は何が間違っているのですか?ありがとう!