1. 要点
- html页面中的表单必须是enctype=”multipart/form-data”
- 使用jquery-form的ajaxSubmit进行表单提交
- 使用SpringMVC进行处理,需要配置multipartResolver
- SpringMVC控制器中判断request是否包含文件,有文件则处理文件,没有文件则按原业务逻辑进行处理
2. 步骤
2.1 html页面
需要设置表单的enctype=”multipart/form-data”。并使用jQuery-form的ajaxSubmit提交表单。
<form id="addForm" action="<c:url value='/doAdd'/>" method="POST" enctype="multipart/form-data">
<input type="text" name="name" />
<!-- 可以是任意个文件域 -->
<input type="file" name="file1"/>
<input type="file" name="file2"/>
<input type="file" name="file3"/>
<input type="button" id="submitBtn" value="提交"/>
</form>
<!-- 引入依赖的Jquery和JQuery-Form -->
<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/jquery.form/4.2.1/jquery.form.min.js"
integrity="sha384-tIwI8+qJdZBtYYCKwRkjxBGQVZS3gGozr3CtI+5JF/oL1JmPEHzCEnIKbDbLTCer"
crossorigin="anonymous"></script>
<!-- 自定义JavaScript -->
<script type="text/javascript">
$("#submitBtn").on("click", function(){
$("#addForm").ajaxSubmit({
success : function(data){
alert(data);
},
error : function(){
alert("请求错误");
}
});
});
</script>
2.2 SpringMVC配置
需要配置multipartResolver。
<!-- 文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" ref="maxUploadSize"></property>
</bean>
<!-- 上传文件 最大 50M -->
<bean id="maxUploadSize" class="java.lang.Long" >
<constructor-arg index="0">
<value>52428800</value>
</constructor-arg>
</bean>
2.3 Controller
对于控制层,如果request是MultipartHttpServletRequest类型,则说明表单中有文件,则可以对文件进行处理。如果没有上传文件,则对表单中的其它属性进行处理。
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
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 org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
public class TestFileController {
@RequestMapping("/doAdd")
@ResponseBody
public String doAdd(@RequestParam("name") String name, HttpServletRequest request){
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
// 获取上传的文件
Map<String, MultipartFile> fileMap = multipartHttpServletRequest.getFileMap();
for(Map.Entry<String, MultipartFile> entry : fileMap.entrySet()){
// 对文件进处理
System.out.println(entry.getKey() + ":" + entry.getValue().getOriginalFilename());
}
}
// 对name进行处理
System.out.println(name);
return "ok";
}
}