【问题标题】:Spring MVC with ajax file upload and MultipartFileSpring MVC 与 ajax 文件上传和 MultipartFile
【发布时间】:2011-11-06 22:40:17
【问题描述】:

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

【问题讨论】:

  • 堆栈跟踪有助于诊断
  • 是的,这就是我在这里问的主要原因,因为容器中没有任何堆栈跟踪

标签: ajax spring spring-mvc


【解决方案1】:

我在使用 Fineuploader(值)时遇到了同样的问题,我尝试使用 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】:

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

    问候,

    帕迪姆纳

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

        【解决方案4】:

        当使用valums 插件时,我通过使用@RequestBody Spring 注解解决了这个问题。 你可以重写你的代码如下:

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

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

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

        【讨论】:

          【解决方案5】:

          @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:请求被拒绝,因为没有找到多部分边界

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-28
            • 2012-06-06
            • 2015-11-03
            • 1970-01-01
            • 1970-01-01
            • 2018-06-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多