我目前正在使用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
注释,这令人惊讶地工作。
如果参数可在@ModelAttribute
对象中检索,为什么没有@RequestParam
工作?
为什么HttpServletRequest
有效?我应该使用它而不是从@ModelAttribute
明确检索内容吗?
答案 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...
}
希望有所帮助!