带有ajax文件上传和MultipartFile的Spring MVC

时间:2011-08-30 15:53:23

标签: ajax spring spring-mvc

我在使用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文件上传为我执行此操作),我得到内部服务器错误响应,并且日志中没有显示任何内容。我现在真的很难过,因为我无法弄清楚问题。

5 个答案:

答案 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