我正在尝试使用AJAX和Spring MVC动态上传文件。
这是我在做什么:
JavaScript函数:
function initQwacCertificate(){
$('#qwac').on('change', function(){
var formData = new FormData();
var file = $('#qwac')[0].files[0];
formData.append("myFileKey", file);
$.ajax({
url : postQwac,
type : 'POST',
data : formData,
enctype : 'multipart/form-data',
contentType : false,
cache : false,
processData : false,
success : function(response) {},
});
});
};
Java控制器:
@PostMapping(value = "/extractQwacCertificate", consumes = { "multipart/form-data" })
ExtractedQwacCertificate extractQwacCertificate(@RequestParam("myFileKey") MultipartFile uploadedFile) throws IOException, CertificateException {
//MyStuff
}
所有这些东西在我的JS控制台中返回了我不明白的400错误:
所需的请求部分“ myFileKey”不存在
但是对我来说,这个“ myFileKey”存在!我做错了什么,但我不知道该怎么办!有人看到错了吗?
谢谢
答案 0 :(得分:1)
您可能没有注册StandardServletMultipartResolver
(或Servlet 3.0之前的CommonsMultipartFile
)。如果没有MultipartResolver,Spring将不知道如何从请求中提取文件。
对于Servlet 3.0,您需要将其添加到调度程序Servlet中:
public class MainWebAppInitializer implements WebApplicationInitializer {
private String TMP_FOLDER = "/tmp";
private int MAX_UPLOAD_SIZE = 5 * 1024 * 1024;
@Override
public void onStartup(ServletContext sc) throws ServletException {
ServletRegistration.Dynamic appServlet = sc.addServlet("mvc", new DispatcherServlet(
new GenericWebApplicationContext()));
appServlet.setLoadOnStartup(1);
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(TMP_FOLDER,
MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2);
appServlet.setMultipartConfig(multipartConfigElement);
}
}
然后注册多部分解析器(给出了Java配置示例):
@Bean
public StandardServletMultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}