如何在PlayFramework中用Java处理FineUploader POST请求?

时间:2015-05-15 14:19:04

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

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

2 个答案:

答案 0 :(得分:0)

我最终通过探索play apis,下面的示例代码找到了。

    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]);
    }

答案 1 :(得分:-1)

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

var App = React.createClass({
    getInitialState: function() {
        return {
            client: null
        }
    },

    // the rest of the code is same

    render: function() {
        const { client } = this.state;
        
        if(client === null) {
            return (<div></div>); // or return null
        }
        
        return (
            <div>
                {client.Memory.Available}
            </div>
        )
    }
});

修改其余代码以生成我自己的类来替换FileItem(在我的情况下称为类“FineUploaderItem”),重构RequestParser以及Multipart解析如何工作使我的服务器端点工作。我能够在我的代码中使用UploadReceiver类中的所有私有方法,在此之后进行很少的修改,并且一切正常。