我在使用Spring 3 MVC上传Ajax时遇到了问题。我知道我必须在spring config中配置multipartResolver bean,我已经完成了。我可以拥有这样的控制器
@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 Ajax文件上传为我执行此操作),我得到内部服务器错误响应,并且日志中没有显示任何内容。我现在真的很难过,因为我无法弄清楚问题。
答案 0 :(得分: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 :(得分:2)
我遇到了与fineuploader(valums)相同的问题,我尝试使用request.getInputStream()但是没有让它工作。
@ResponseBody注释有效,但我得到了整个标题。我认为处理和剥离不需要的块不是很优雅。 我进一步观察,发现解决方案是这篇文章:
problem with spring ajax file upload
就像说的那样,我将多部分解析器的bean配置添加到我的spring配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>
之后,我可以使用
轻松检索我的文件 public @ResponseBody Map ajaxUploadFile(@RequestParam MultipartFile qqfile) { ... }
不要忘记在项目中添加Apache commons-io.jar 和 commons-fileupload.jar 库以使其正常工作
答案 2 :(得分: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调度程序的Servlet.service()引发了异常 org.apache.commons.fileupload.FileUploadException:请求被拒绝,因为没有找到多部分边界
答案 3 :(得分:1)
使用valums插件时,我使用@RequestBody
Spring注释解决了这个问题。
您可以按如下方式重写代码:
@RequestMapping(value ="/settingsSim",method=RequestMethod.POST)
@ResponseBody
public Map uploadSimSettings(@RequestBody String body) {
/*
some controller logic
*/
}
请注意,变量body
将包含上传文件的内容。此示例中没有方法声明,这意味着您的方法将映射到GET请求。
P.S。在使用Apache Commons解析请求时,我也遇到了这个“没有多部分边界”的问题。 HttpServletRequest#getParts()
只返回一个空集合。
答案 4 :(得分:1)
根据我的观察,文件上传插件不会发送多部分文件,而是发送一个流。我可以通过声明控制器方法接受文件名作为请求param qqfile而第二个参数作为httprequest来使它工作。然后我使用request.getinputstream进行了进一步处理。希望有所帮助!
此致
Pradyumna