播放2.0.4文件上传不起作用?总是“MissingFilePart”

时间:2012-12-06 08:08:43

标签: java scala file-upload playframework-2.0

我正在尝试使用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

现在,当我在服务器端上传文件并进行调试时,这就是我得到的请求:

Server side debugging

如果我正确阅读,则表示文件内容丢失。发生了什么?字节在传输中丢失了吗?如果出现故障,为什么Play不抛出异常?

我在Chrome和Internet Explorer中都尝试过这种方法,两次都有相同的结果。

我做错了什么?谢谢!

2 个答案:

答案 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 也是以同样的方式失败了?