如何检索使用jQuery fileupload发布到Java servlet的表单数据?

时间:2016-03-04 01:25:39

标签: java jquery file-upload jquery-file-upload servlet-3.0

jQuery fileupload文档说我可以通过在提交之前将formData参数设置为对象来发送其他表单数据参数。我是这样做的:

data.formData = {'a':'one', 'b':'two'};

...然后调用data.submit()。调用我的Java servlet(3.x),但是当我尝试以正常方式检索参数时,例如

request.getParameter("a");

......那里什么也没有(即它null)。我也查看了request.getParameterNames()request.getParameterMap(),他们都是空的。

如何访问参数?

这些是我的文件上载初始化选项:

url: '/my-upload-servlet',
autoUpload: false,
singleFileUploads: false,
maxFileSize: 9000000,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png|tif|tiff|pdf)$/i,
dataType: 'json',
previewMaxWidth: 128,
previewMaxHeight: 85,
disableImageResize: false,
previewCrop: true,

我还尝试将formData选项设置为一个对象数组,文档说这也是一个选项,例如。

data.formData = [ {name:'a', value:'one'}, {name:'b', value:'two'} ]

......但它仍然无效。

以下是上传文件的完整代码段(注释掉的内容是我尝试过的其他内容):

var params = new FormData();
params.append('params', JSON.stringify({a:'one', b:'two'}) );
data.formData = params;

//data.formData = {a:'one', b:'two'};

//data.formData = [
//    { name: 'a', value: 'one' },
//    { name: 'b', value: 'two' },
//];

//data.url = '/my-upload-servlet?a=one&b=two';

data.submit()
    .success(function (result, textStatus, jqXHR) {
        console.log('Hurray!');

    }).error(function (jqXHR, textStatus, errorThrown) {
        console.log('Boo!');

    }).complete(function (result, textStatus, jqXHR) { 
        console.log('Done');
    });

这些都不适合我。
无论我尝试上述哪种方法,调用HttpServletRequest.getParameter("a")HttpServletRequest.getParameter("params")(在FormData的情况下)始终返回null

3 个答案:

答案 0 :(得分:1)

我们无法在文件上传(object)请求的有效负载中发送multipar。我们只能发送键值对。但是,如果我们要发送json,那么我们首先需要将其转换为字符串,使用:

var data = JSON.stringify(formData);

完成后,我们可以在请求有效负载中发送它,并在servlet中对其进行反序列化,例如:

mapper.readValue(request.getParameter(""), YourClass.class);

答案 1 :(得分:0)

我在检查Chrome开发者控制台之后才意识到请求一直包括请求有效负载中的参数(即使将formData设置为对象)。

问题一直是在servlet上访问它们。这个问题让我走上了正确的道路:Getting request payload from POST request in Java servlet

我实际上是在servlet端使用Apache Commons FileUpload,所以我可以用这样的方式访问参数:

FileItemIterator iterator = upload.getItemIterator(request);
while ( iterator.hasNext() ){
    FileItemStream item = iterator.next();
    String paramName = item.getFieldName();
    InputStream paramValueStream = item.openStream();
    // do it...
} 

答案 2 :(得分:0)

这个答案对我很有帮助,使用jQuery FileUpload插件将文件发送到Java Servlet: https://github.com/blueimp/jQuery-File-Upload

https://stackoverflow.com/a/32555960/2668852