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 信息的表单创建的
JQuery 和 Content-Type 的这个问题与 how-to-send-formdata-objects-with-ajax-requests-in-jquery
相似
我在尝试使用 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
之类的东西之前尝试仅使用 XMLHttpRequestHTML:
<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 信息的表单创建的
JQuery 和 Content-Type 的这个问题与 how-to-send-formdata-objects-with-ajax-requests-in-jquery
相似