如何在 Play 框架中处理 Java 中的文件上传 POST 请求?

How to handle FineUploader POST request in Java in PlayFramework?

我正在尝试将 FineUploader 集成到我的播放框架代码中。视图部分已正确设置并且工作正常。

我不清楚如何在我的控制器上传方法中检索文件。以及其他查询参数,qquuid,qqfilename,content-typee.tc.

以下是FileUploader发送的文件上传请求转储:-

Request Headers

Accept:application/json
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Cache-Control:no-cache
Connection:keep-alive
Content-Length:1021645
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryk8BZISBKKjjqiWQ6
DNT:1
Host:localhost:9000
Origin:http://localhost:9000
Referer:http://localhost:9000/computers
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36
X-Requested-With:XMLHttpRequest

Request Payload
------WebKitFormBoundaryk8BZISBKKjjqiWQ6
Content-Disposition: form-data; name="id"

593
------WebKitFormBoundaryk8BZISBKKjjqiWQ6
Content-Disposition: form-data; name="qquuid"

bafb6448-1a87-40cc-abae-9624f37131cc
------WebKitFormBoundaryk8BZISBKKjjqiWQ6
Content-Disposition: form-data; name="qqfilename"

Test.png
------WebKitFormBoundaryk8BZISBKKjjqiWQ6
Content-Disposition: form-data; name="qqtotalfilesize"

1020995
------WebKitFormBoundaryk8BZISBKKjjqiWQ6
Content-Disposition: form-data; name="qqfile"; filename="Test.png"
Content-Type: image/png


------WebKitFormBoundaryk8BZISBKKjjqiWQ6--

我最终通过探索 play api 找到了答案,下面是示例代码。

    Http.MultipartFormData body = request().body().asMultipartFormData();
    Http.MultipartFormData.FilePart uploadFilePart = body.getFile("qqfile");

    String fileName = uploadFilePart.getFilename();
    File file = uploadFilePart.getFile(); 


    Map<String,String[]> dataPart = request().body().asMultipartFormData().asFormUrlEncoded();

    Iterator it = dataPart.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        String[] values  = (String[]) pair.getValue();
        System.out.println(pair.getKey() + " = " + values[0]);
    }

我之前的评论表明 http post fineuploader 正在做的事情可能有问题,但这当然是错误的。我试图将传统端点示例代码改编成 Spring 4.x MVC 控制器,并从 Apache Commons FileUpload 库中获取空的 FileItem 列表。下载 Spring 的源代码并通过它进行调试后,发现 Spring MVC 在到达我的控制器代码之前使用相同的 Apache Commons FileUpload 库来使用 http post 请求。第二次调用 Apache 的 FileUpload.parseRequest returns 一个空的 FileItem 列表,因为它已经被使用了。我不得不重新调整控制器代码的用途,以便为请求参数使用正确的签名。我发现让 MVC 框架为我进行解析工作是最简单的。为此进行重构后,我仍然能够将大部分示例代码用于传统端点。比如我的控制器

@RequestMapping(value="/assetUpload", method = RequestMethod.POST)
public void assetUpload(HttpServletRequest request, HttpServletResponse response, @RequestParam("qqfile") MultipartFile file) throws ServletException, IOException { ....

修改其余代码以生成我自己的 class 以替换 FileItem(在我的例子中称为 class "FineUploaderItem"),重构 RequestParser 以及 Multipart 解析的方式工作让我的服务器端点工作。我能够在我的代码中使用 UploadReceiver class 中的所有私有方法,在此之后几乎没有修改,并且一切正常。