2011-08-30 110 views
2

我有一个使用Spring 3 MVC进行Ajax上传的问题。我明白我必须在spring配置中配置multipartResolver bean,我已经完成了。比我能有控制器这样使用ajax文件上传和MultipartFile的Spring MVC

@RequestMapping(value ="/settingsSim") 
@ResponseBody 
public Map uploadSimSettings(@RequestParam(value="qqfile", required=true) MultipartFile settings) { 
Map<String, Object> ret = new HashMap<String, Object>(); 
return ret; 
} 

的问题是,当我真正发送请求到服务器(实际上valums阿贾克斯文件上载做到这一点对我来说),我得到一个内部服务器错误响应,并没有什么出在日志中。我现在真的很挠头,因为我无法弄清楚问题所在。

+0

堆栈跟踪将有助于诊断 – atrain

+0

是它会,这是我问这里的主要原因,因为没有任何来自容器的堆栈跟踪 –

回答

1

当使用valums插件,我用@RequestBody春天注解解决了这个问题。 可以按如下步骤重写代码:

@RequestMapping(value ="/settingsSim",method=RequestMethod.POST) 
@ResponseBody 
public Map uploadSimSettings(@RequestBody String body) { 
/* 
some controller logic 
*/ 
} 

注意变量body将包含上传文件的内容。您的示例中也没有方法声明,这意味着您的方法将映射到GET请求。

P.S.在使用Apache Commons解析请求时,我也有这个“没有多部分边界”的问题。 HttpServletRequest#getParts()只返回一个空集合。

1

@Tomas我在使用相同的jquery插件时遇到同样的问题。请将插件代码中的Content-Type更改为xhr.setRequestHeader(“Content-Type”,“multipart/form-data”);在我的插件的行1203,此后它现在显示堆栈跟踪,但是我遇到另一个问题,日志正在打印: 2011年9月8日上午9时43分39秒org.apache.catalina.core.StandardWrapperValve调用 重度:Servlet.service()进行servlet调度抛出异常 org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有多边界发现

3

我的解决方案:

@RequestMapping(value = "/create/upload", method = RequestMethod.POST, consumes="multipart/form-data", produces="application/json") 
@ResponseBody() 
public String handleImageUpload(@RequestParam(value="qqfile", required=true) MultipartFile[] files, 
     @ModelAttribute(value="files") List<MultipartFile> filesSession) throws IOException, FileUploadException { 

    if (files.length > 0) { 
     filesSession.addAll(Arrays.asList(files)); 
     // store the bytes somewhere 
     return "{\"success\": true}"; 
    } 
    else { 
     return "{\"success\": false}"; 
    } 
} 

@RequestMapping(value = "/create/upload", method = RequestMethod.POST, consumes="application/octet-stream", produces="application/json") 
@ResponseBody() 
public String handleImageUploadApplication(HttpServletRequest request, 
     @ModelAttribute(value="files") List<MultipartFile> filesSession) throws IOException, FileUploadException { 

    if (request.getInputStream() != null) { 
     // creamos el fichero temporal 
     File file = File.createTempFile("file", "valumns", 
       RepositoryData.getRepositoryData()); 
     FileOutputStream fos = new FileOutputStream(file); 
     // copiamos contenido 
     Streams.copy(request.getInputStream(), fos, true); 
     //TODO: 
     //filesSession.addAll(Arrays.asList(files)); 
     // store the bytes somewhere 
     return "{\"success\": true}"; 
    } 
    else { 
     return "{\"success\": true}"; 
    } 
} 

@ExceptionHandler(Exception.class) 
@ResponseStatus(value = HttpStatus.SERVICE_UNAVAILABLE) 
public void handleException(Exception ex) { 
    log.error("Ocurrio un error en el album", ex); 
} 
1

按我的观察,文件上传插件不发送多文件,但发送流。我可以通过声明控制器方法来接受文件名作为请求参数qqfile和第二个参数作为httprequest。然后我使用request.getinputstream进行了进一步的处理。希望有所帮助!

问候,

Pradyumna

2

我有同样的问题与fineuploader(valums),我尝试使用request.getInputStream(),但没有得到它的工作。

@ResponseBody注释工作,但我得到了与标题整个身体。我认为处理和剥离不需要的块不是很优雅。 我还看了一下,发现该解决方案是这一职位:

problem with spring ajax file upload

就像是说,我添加了多解析器的bean的配置,我的春天配置

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
</bean> 

在那之后,我可以很容易地检索我的文件使用

public @ResponseBody Map ajaxUploadFile(@RequestParam MultipartFile qqfile) { ... } 

不要忘了添加Apache 个公地io.jar公地fileupload.jar库在项目中得到它的工作