我正在尝试使用 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 个文件。
这是我的控制器:
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);
}
}
这个方法在路由文件中是这样定义的:
POST /immediatecollections/save-policereport controllers.ImmediateCollections.savePoliceReport
现在,当我在服务器端上传文件并进行调试时,这就是我得到的请求:
如果我没看错,说明文件内容丢失。发生了什么?字节在传输中丢失了吗?如果发生故障,为什么 Play 不抛出异常?
我在 Chrome 和 Internet Explorer 中都试过了,两次结果都一样。
我究竟做错了什么?谢谢!