【问题标题】:How to handle FineUploader POST request in Java in PlayFramework?如何在 PlayFramework 中处理 Java 中的 FineUploader POST 请求?
【发布时间】:2015-05-15 14:19:03
【问题描述】:

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

我不清楚如何在我的控制器上传方法中检索文件。以及其他查询参数,qquuid, qqfilename, content-type e.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--

【问题讨论】:

  • @RayNicholus 我可以在游戏网站上找到文档。我在检索查询参数时遇到问题。如果我做 Map queryString = request().queryString();对于上面发布的请求,我得到了空地图。根据 Fine Uploader 文档,这些参数将出现在查询字符串文档中。 docs.fineuploader.com/endpoint_handlers/traditional.html你能告诉我如何检索这些参数吗?
  • 默认情况下,Fine Uploader 在上传文件时会发送多部分编码请求。您可以通过查看粘贴到问题中的请求来查看这一点。我提供的链接将向您展示如何使用 play 处理 MPE 请求。

标签: multipartform-data playframework-2.2 fine-uploader


【解决方案1】:

我最终通过探索 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]);
    }

【讨论】:

  • 当您回答自己的问题时,请更具体一些...比如如果必须让其他人回答您,您希望如何回答。
【解决方案2】:

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

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

修改其余代码以生成我自己的类来替换 FileItem(在我的例子中称为“FineUploaderItem”类),重构 RequestParser 以及 Multipart 解析的工作方式使我的服务器端点正常工作。我可以在代码中使用 UploadReceiver 类中的所有私有方法,在此之后只需要进行很少的修改就可以了。

【讨论】:

  • 我不知道你在说什么
  • 在 git repo 中提供的示例 java 代码中,使用 org.apache.commons.fileupload.servlet.ServletFileUpload 从请求中提取“FileItems”。该代码无法使用 ServletFileUpload.parseRequest 查找和提取任何文件项。也许我对实际文件项的请求的 Content-Disposition 设置有误。我必须对此进行更多研究,但是 HTTP 发布请求的构造方式有所不同,导致 Apache 请求处理工具无法解析它。
  • 我查看了另一个确实上传的 jquery 库,我对 Content-Disposition 问题弄错了,因为我看到“form-data”是正确的,但是 HTTP 发布的方式有些不同request 的构造导致 Apache 请求处理工具无法解析它。
  • 我发现了自己的问题。我将示例 java 代码改编到我自己的项目中,该项目基于 Spring MVC,它在我的控制器代码接收请求之前预先解析请求。当我再次使用 apache 库对其进行解析时,它将为 FileItems 返回一个空数组。我需要重构我的控制器以正确使用 Spring 的 MultipartHTTPServletRequest。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2015-07-13
相关资源
最近更新 更多