Spring MVC 4 AJAX上传带有额外参数的MultipartFile

时间:2016-07-28 20:10:43

标签: java jquery ajax spring-mvc spring-annotations

我目前正在使用AJAX (jQuery)和 Spring MVC 4 开发文件上传。除了文件本身,我还需要发送一些额外的参数,例如正在上传的文件的描述。我使用$.ajax()调用发送FormData对象以及我的CSRF令牌,如下所述:

var formdata = new FormData();
    formdata.append("description", $('#description').val());
    formdata.append("file", $("#file")[0].files[0]);

$.ajax({
    url: '/upload',
    type: 'POST',
    headers : {"X-CSRF-TOKEN" : $('#myToken').val()}
    data: formdata,
    enctype: 'multipart/form-data',
    processData: false,
    contentType: false,
    success: function (data) {
        alert("Data Uploaded: "+data);
    }
});

我找到了多个如何使用javascript的FormData对象上传文件以及接收MultipartFile对象的Spring控制器的示例,但是当我尝试使用{检索其他参数时{1}}我最终收到错误。下面是我尝试的一个例子(没有工作):

@RequestParam

经过大量的研究和尝试不同的方法,我发现我可以将@RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public boolean uploadFile( @RequestParam(value = "file") MultipartFile file, @RequestParam(value = "description") String description) { //Do stuff... } 声明为参数,它可以让我检索每个参数(但不是文件本身)。 以下是一个工作示例

HttpServletRequest

即使上面的例子有效,但我无法使用注释并在方法签名中明确显示我的参数这一事实让我很烦恼。所以我尝试了一种不同的方法来更改@RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public boolean uploadFile( @RequestParam(value = "file") MultipartFile file, final HttpServletRequest request) { String description = request.getParameter("description"); //Do some other stuff... } 注释的@PRequestParam注释,这令人惊讶地工作。

我的问题是:

  1. 如果参数可在@ModelAttribute对象中检索,为什么没有@RequestParam工作?

  2. 为什么HttpServletRequest有效?我应该使用它而不是从@ModelAttribute明确检索内容吗?

1 个答案:

答案 0 :(得分:0)

这可能为时已晚,但你可以将描述作为参数传递给网址:

url: '/upload?' + $.param({description: $('#description').val()});

不要忘记问号!

并且您只需传递实际文件的数据:

data: $("#file")[0].files[0]

你的控制器看起来像这样:

@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public boolean uploadFile(
    @RequestParam(value = "file") MultipartFile file, 
    @RequestParam(value = "description") String description) {

//Do stuff...

}

希望有所帮助!