Spring已经为我们提供了一个MultipartResolver的实现,我们只需要拿来用就可以了,
那就是org.springframework.web.multipart.commons.CommsMultipartResolver。
因为springMVC的MultipartResolver底层使用的是Commons-fileupload,
所以还需要加入对 Commons-fileupload.jar 的支持。
如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在
spring的applicationContext里面加上springMVC提供的MultipartResolver的申明。
这样之后,客户端每次进行请求的时候,springMVC都会检查request里面是否包含多媒体信息,
如果包含了就会使用MultipartResolver进行解析,springMVC会使用一个支持文件处理的
MultipartHttpServletRequest来包裹当前的HttpServletRequest,
然后使用MultipartHttpServletRequest就可以对文件进行处理了。
第一步
需要在applicationContext.xml文件中引入如下配置:
<!-- 多部分文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--设置允许上传的最大文件大小,以字节为单位计算。
当设为-1时表示无限制,默认是-1 -->
<property name="maxUploadSize" value="104857600" />
<!--设置在文件上传时允许写到内存中的最大值,
以字节为单位计算,默认是10240 -->
<!-- <property name="maxInMemorySize" value="4096" /> -->
<!--属性启用是为了推迟文件解析,以便在UploadAction中捕获文件大小异常 -->
<!-- <property name="resolveLazily" value="true"/> -->
<!-- 设置上传文件时的临时目录,默认是Servlet容器的临时目录 -->
<!--<property name="uploadTempDir" value=""/>-->
<!--表示用来解析request请求的默认编码格式,
当没有指定的时候根据Servlet规范会使用默认值ISO-8859-1。
当request自己指明了它的编码格式的时候就会忽略这里指定的defaultEncoding -->
<!-- <property name="defaultEncoding" value="UTF-8"></property> -->
</bean>
前端页面
注意:form表单必须加上enctype=”multipart/form-data”
<!--需要引入jquery 大家根据自己的路径引入-->
<script type="text/javascript" src="jquery.min.js"></script>
<form name="frm" id="frm" action="/demoAdmin/addFile" method="post" enctype="multipart/form-data">
<input type="file" name="file1" />
<input type="file" name="file2" />
<!-- 如果不需要异步 这里直接写submit按钮就可以 -->
<!-- <input type="submit" value="上传" /> -->
<!---点该按钮 异步提交-->
<input type="button" onclick="upLoad();" value="上传" />
</form>
<script type="text/javascript" >
//提交方法
function upLoad(){
//获取表单方式一: 这种方式是获取第一个表单
//var formData = new FormData($('form')[0]);
//获取表单方式二:这种方式是得到name属性为frm的第一个表单元素
//var solform=$("form[name='frm']")[0];
//var formData= new FormData(solform);
//获取表单方式三:这种是先得到所有表单,然后再遍历找到你需要的表单
var formData =null;
var fs=$('form');//得到所有表单
for(var i=0;i<fs.length;i++){//遍历
if(fs[i].id=="frm"){//匹配表单id为frm的表单
formData= new FormData(fs[i]);//实例对象
}
}
$.ajax({
url: '/demoAdmin/addFile',//请求路径
type: 'POST',//提交方式
success: function(data){//成功方法
//判断返回success表示成功
if("success"==data){
}else{//否则失败
zzrw.alert("操作失败");
}
},error:function(){//请求失败方法
zzrw.alert("系统繁忙,请稍后再试!");
},
data:formData,// Form表单数据
//设置jQuery不处理数据或担心的内容类型
cache: false,
contentType: false,
processData: false
});
}
</script>
后台处理方式一:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
/**
* 保存文件
* @param name 文件新的名称
* @param request
* @return
*/
@RequestMapping(value = "addFile")
@ResponseBody
public String addFile(String name, HttpServletRequest request) {
String result = "error";
DefaultMultipartHttpServletRequest MultipartRequest = (DefaultMultipartHttpServletRequest) request;
Iterator<String> iter = MultipartRequest.getFileNames();//得到所有文件
String loadUrl="d://file";//上传路径
try {
//判断下一个文件不为空,如果有多个可使用while循环遍历
if (iter.hasNext()) {
//得到当前文件
MultipartFile file = MultipartRequest.getFile(iter.next());
//得到文件名称
String fileName = file.getOriginalFilename();
//得到文件后缀
String lastname = fileName.substring(fileName.lastIndexOf("."));
//构建新的文件名
String newfileName=name+lastname;
// 创建文件对象,第一个参数是文件夹目录,第二个参数是文件名称
File target = new File(loadUrl,newfileName);
//判断是否存在
if (!target.exists()) {
target.mkdirs();//不存在则创建
}
file.transferTo(target);//上传文件
result="success";//表示成功
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
后台处理方式二:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
/**
* 保存文件
* @param name 文件名称
* @param file1 文件1
* @param file2 文件2
* @return
*/
@RequestMapping(value = "addFile")
@ResponseBody
public String saveOrUpdateOK(String name, @RequestParam("file1") MultipartFile file1,
@RequestParam("file2") MultipartFile file2,HttpServletRequest request) {
String result="error";
try{
//判断文件1不为空
if(!file1.isEmpty()) {
//得到文件1名称
String fileName1 = file1.getOriginalFilename();
//得到文件1后缀名
String lastname1=fileName1.substring(fileName1.lastIndexOf("."));
//构建新的文件名
fileName1=name+"1"+lastname1;
//创建文件对象,第一个参数是文件夹目录,第二个参数是文件名称
File target1 = new File("D:file",fileName1);
//判断目录是否存在
if(!target1.exists()){
target1.mkdirs();//不存在则创建
}
file1.transferTo(target1);//上传
}
//判断文件2不为空
if(!file2.isEmpty()) {
//得到文件2名称
String fileName2 = file2.getOriginalFilename();
//得到文件2后缀名
String lastname2=fileName2.substring(fileName2.lastIndexOf("."));
//构建新的文件名
fileName2=name+"2"+lastname2;
//创建文件对象,第一个参数是文件夹目录,第二个参数是文件名称
File target2 = new File("D:file",fileName2);
//判断目录是否存在
if(!target2.exists()){
target2.mkdirs();//不存在则创建
}
file2.transferTo(target2);//上传
}
result="success";//表示成功
}catch(Exception e){
e.printStackTrace();
}
return result;
}