我正在尝试使用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 bootstrap扩展名。)
请注意,我只有一个输入字段。此表单仅用于一个目的:上传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和Internet Explorer中都尝试过这种方法,两次都有相同的结果。
我做错了什么?谢谢!
答案 0 :(得分:1)
这最终在Google群组中得到了解决,我将从那里重新发布答案:
詹姆斯罗珀:当multipart中的文件名字段时抛出MissingFilePart 数据为空(名称有点误导)。为什么浏览器会 发送一个空文件名,这是一个有趣的问题。在里面 Chrome开发工具网络标签,你可以上传一个小的(只有一个 几个字节)文件,然后在请求体中看看?您可以...吗 在这里发布请求正文?看起来应该是这样的:
- AaB03x content-disposition:form-data; NAME = “图片”; filename =“file1.txt”Content-Type:text / plain
这是上传文件的内容 --AaB03x -
这里的另一个问题是HTML规范鼓励客户 尽最大努力提交文件名参数,这不是强制性的 如果不存在,Play不应该失败。
我的回复:
你是对的,文件名丢失了。事实证明,Jasny的 javascript以某种方式打破了输入元素。我只是替换它 一个没有花哨标记的基本元素,因为缺乏 时间,也许我稍后会回到这里。如果有人弄清楚了 解决方案我会很高兴听到它,但是现在我会保持原样。
感谢詹姆斯的回复,这对我的影响很大 找到那个错误的时间更长。 : - )
TLDR:输入标记中缺少名称属性
答案 1 :(得分:0)
听起来很奇怪,例如:http://www.playframework.com/documentation/2.0/JavaFileUpload 也是以同样的方式失败了?