【问题标题】:Play 2.0.4 File upload not working? Always "MissingFilePart"播放 2.0.4 文件上传不起作用?总是“缺少文件部分”
【发布时间】:2013-02-27 23:38:02
【问题描述】:

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

(对于那些想知道 span 和 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);
    }
}

这个方法在路由文件中是这样定义的:

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

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

如果我没看错,说明文件内容丢失。发生了什么?字节在传输中丢失了吗?如果发生故障,为什么 Play 不抛出异常?

我在 Chrome 和 Internet Explorer 中都试过了,结果都一样。

我做错了什么?谢谢!

【问题讨论】:

    标签: java scala file-upload playframework-2.0


    【解决方案1】:

    这最终在 Google 群组中得到解决,我将从那里重新发布答案:

    詹姆斯·罗珀:

    当多部分中的文件名字段时抛出MissingFilePart 数据为空(名称有点误导)。为什么会有浏览器 发送一个空文件名,这是一个有趣的问题。在里面 Chrome开发工具网络标签,能不能上传一个小(只有一个 几个字节)文件,然后查看请求正文?您可以...吗 在此处发布请求正文?它应该看起来像这样:

    --AaB03x 内容配置:表单数据;名称="图片"; filename="file1.txt" 内容类型:文本/纯文本

    这是上传文件的内容 --AaB03x--

    这里的另一个问题是,虽然 HTML 规范鼓励客户 尽量提交文件名参数,不是强制的 字段,所以如果它不存在,Play 应该不会失败。

    我的回应:

    你是对的,文件名丢失了。原来Jasny的 javascript 以某种方式破坏了输入元素。我只是将其替换为 一个没有花哨标记的基本元素,因为缺乏 时间,也许我会稍后再谈。如果有人想出一个 解决方案我很高兴听到它,但现在我会保持原样。

    感谢您的回复詹姆斯,这将花费我很多时间 更长的时间才能找到那个错误。 :-)

    TLDR:输入标签中缺少名称属性

    【讨论】:

      【解决方案2】:

      听起来很奇怪,例子:http://www.playframework.com/documentation/2.0/JavaFileUpload 也同样失败?

      【讨论】:

      • 啊,感谢您的回复,但最终通过添加缺少的名称属性来解决。 :-) 我在这里转发了回复
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      相关资源
      最近更新 更多