我正在尝试使用Ajax,
Spring MVC 3.2.0,Tomcat 8.0.9上传多部分文件,但无法使其工作.我在stackoverflow(
Spring upload file problems,
MultipartConfig with Servlet 3.0 on Spring MVC,…)上阅读了很多博客和类似的帖子,这似乎有类似的原因,但无法弄清楚如何解决它.奇怪的是,当文件小于1MB时上传工作,但是当录制的视频超过该大小时,会引发以下错误:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. null
org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:163)
org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:110)
在下面,您可以看到我所做的所有配置:
> AJAX POST-Request:
var videoBlob = e.data;
var pathArray = window.location.pathname.split( '/' );
var userID;
for (i = 0; i < pathArray.length; i++) {
if (pathArray[i].toString() == "edit"){
userID = pathArray[i+1];
}
}
var fd = new FormData();
fd.append('fname', 'video');
fd.append('data', videoBlob);
$.ajax({
url: '/user/edit/uploadVideo/' + userID,
data: fd,
processData: false,
contentType: false,
type: 'POST',
success: function(data)
{
$('#result').html(data + "uploaded by FormData!");
}
});
> web.xml
contextConfigLocation
classpath*:root-context.xml
spring.profiles.default
common
org.springframework.web.context.ContextLoaderListener
appServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:servlet-context.xml
1
appServlet
/
springMultipartFilter
springMultipartFilter
org.springframework.web.multipart.support.MultipartFilter
springMultipartFilter
/*
> servlet-context.xml
de.talentwuerfel
update
org.hibernate.dialect.MySQL5Dialect
true
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
>我定义MultipartResolver的root-context.xml
> Java控制器
@RequestMapping(value = "/edit/uploadVideo/{id}", method = RequestMethod.POST)
public @ResponseBody String uploadVideo(@PathVariable long id, MultipartHttpServletRequest request, HttpServletResponse response) throws IOException {
//.... file handling
}
我怎么解决这个问题?
编辑:
我尝试了建议的方法,并使用Servlet实现来管理我的视频文件上传.已进行了以下调整,但仍然会导致类似的错误:
>调整后的@Controller:
@RequestMapping(value = "/edit/uploadVideo/{id}", method = RequestMethod.POST)
public String uploadVideo(@PathVariable long id, @RequestParam("data") Part file) {
//...
}
> root控制器已被删除,我将multipartResolver添加到servlet-context.xml
> web.xml中的标记已通过以下Multipart-Configuration进行了扩展:
appServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:servlet-context.xml
1
/tmp
20848820
418018841
1048576
但是,我仍然收到异常,无法上传大于1MB的blob文件:
Could not parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. null
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:927)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:822)
javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
我实现了一个类似的文件上传,其中只选择了一个文件,并且在使用相同的配置时它完全可以发送大文件.所以我认为它与Ajax POST或附加的blob文件有什么关系?!