- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在开发一个使用 AJAX (jQuery) 和 Spring MVC 4 的文件上传。除了文件本身之外,我还必须发送一些额外的参数,例如正在上传的文件的描述。我使用 $.ajax()
调用发送 FormData
对象以及我的 CSRF token ,如下所述:
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 Controller 上传文件的示例,但是当我尝试使用 @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
注释,结果出人意料地有效。
如果可以在 HttpServletRequest
对象中检索参数,为什么 @RequestParam
不起作用?
为什么@ModelAttribute
有效?我应该使用它而不是从 HttpServletRequest
显式检索内容吗?
最佳答案
这可能来得太晚了,但您可以将描述作为 url 中的参数传递:
url: '/upload?' + $.param({description: $('#description').val()});
别忘了问号!
对于数据,您只需传递实际文件:
data: $("#file")[0].files[0]
你的 Controller 将如下所示:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public boolean uploadFile(
@RequestParam(value = "file") MultipartFile file,
@RequestParam(value = "description") String description) {
//Do stuff...
}
希望有帮助!
关于java - Spring MVC 4 AJAX上传带有额外参数的MultipartFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38645862/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!