Spring 在 WebSphere Liberty 上工作时进行 mvc 多文件上传

Spring mvc multiple file upload while working on WebSphere Liberty

我在尝试使用 ajax 上传多个文件时遇到了一个奇怪的问题 运行。 为什么我们使用 Ajax 上传多个文件? 因为用户想要查看 he/she 尝试上传到服务器的所有文件。审查的意思是,应该允许用户在上传到服务器之前删除文件。

到目前为止我尝试了什么?

JSP

<form id="form1" method="post" action="uploadMultipleFiles" enctype="multipart/form-data">
  <!-- File input -->    
  <input name="file" id="files" type="file"  multiple="multiple"/><br/>
  <button value="Submit" onclick="uploadFiles()" >Upload</button><i>upload</i>
</form>

JS

function uploadFiles(){
  var files = $("#files").prop("files");
  var oMyForm = new FormData();   
  oMyForm.append("file", files[0]);  //currently trying with only one file
      $.ajax({
            url:  'uploadMultipleFiles',
            data: oMyForm,
           // dataType: 'text',
            processData: false,
            contentType: false,
            type: 'POST',
            success: function(data){
                console.log(data)
            }
          });
}

Spring 控制器(版本 3.0.0 发布)

@RequestMapping(value = "/uploadMultipleFiles", method = RequestMethod.POST)
    public @ResponseBody String uploadMultipleFilesHandler(HttpServletRequest request, HttpServletResponse response)  {
  MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
  System.out.println(multipartRequest);   
}

我没有包含完整的控制器代码,但我相信它应该足以满足您提供的任何指针。

Spring bean 配置

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

        <property name="maxUploadSize" value="900000" />

</bean>

异常

java.lang.ClassCastException: com.ibm.ws.webcontainer31.srt.SRTServletRequest31 无法转换为 org.springframework.web.multipart.MultipartHttpServletRequest

请帮我弄清楚我可以做些什么来解决这个异常,请注意相同的代码在 tomcat 中工作,但是 WebSphere Liberty 配置文件似乎有一些问题。

您可以尝试使用 org.springframework.web.multipart.MultipartFile。 我在常规 WAS 7 中上传多个文件时遇到问题,并使用 MultipartFile 修复了它。

示例:

 public @ResponseBody String uploadMultipleFilesHandler(@RequestPart(value="files")List<MultipartFile> attachments, HttpServletRequest request, HttpServletResponse response)

您正在使用 AJAX 调用而不是表单 post 提交。 enctype 不适用于 AJAX 调用。将 "multipart/form-data" 添加到 AJAX 请求

根据您的 JQuery 版本需要添加 ContentType(或不允许)

但是如果 ContentType 没有被发送到控制器,Spring 拦截器使用 Default Resquest 内容类型,该内容类型拦截取决于 servlet 实现,在 WAS 中有一个 "special"由 IBM 制造。

例如,如果您使用 JQuery 小于 1.9 则需要添加 type: 'POST' 以及 method: 'POST'

您可以在使用 JQuery

之类的东西之前尝试仅使用 XMLHttpRequest

HTML:

   <form enctype="multipart/form-data" method="post" name="fileinfo" id="fileinfo"> 
... 

   </form>

Javascript:

var files = $("#files").prop("files");


var formData = new FormData($("#fileinfo"));
formData.append("file", files[0],"myFileName.txt");
var oReq = new XMLHttpRequest();
oReq.open("POST", "uploadMultipleFiles", true);
oReq.send(formData);

看到示例中的 FormtData 是从包含 enctype 信息的表单创建的

Mozilla FormData help

JQuery 和 Content-Type 的这个问题与 how-to-send-formdata-objects-with-ajax-requests-in-jquery

相似