SpringMVC的文件上传基于Apache是Commons FileUpload组件,所以在利用SpringMVC实现文件上传时,需要导入commons fileupload组件的相关jar包:
commons-fileupload-x.y.jar
commons-is-x.y.jar
下面以一个示例的形式来说明具体的实现方式:
- 编写Domain类
package com.springmvc.test.domain;
import java.io.Serializable;
import java.util.List;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.web.multipart.MultipartFile;
/**
* @Description: 文件上传测试
* @Author:Zander
* @CreateDate:Aug 20, 2015
* @Company:
*/
@SuppressWarnings("serial")
public class UploadProduct implements Serializable{
@NotNull
@Size(min=1,max=10)
private String name;
private String description;
private Float price;
//Multipart封装上传的文件
private List<MultipartFile> images;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public List<MultipartFile> getImages() {
return images;
}
public void setImages(List<MultipartFile> images) {
this.images = images;
}
}
其中的MultipartFile类似于File的包装类,Spring将上传的文件封装成MultipartFile对象。
- 编写Controller控制器
package com.springmvc.test.controller;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import com.springmvc.test.domain.UploadProduct;
/**
* @Description: 文件上传测试Controller
* @Author:Zander
* @CreateDate:Aug 20, 2015
* @Company:
*/
@Controller
public class ProductController {
private static final Logger logger = Logger.getLogger(ProductController.class);
@RequestMapping(value="/product_input")
public String inputProduct(Model model){
model.addAttribute("product", new UploadProduct());
return "fileupload";
}
public String saveProduct(HttpServletRequest request,
@ModelAttribute UploadProduct product,
BindingResult bingdingResult, Model model){
List<MultipartFile> files = product.getImages();
List<String> fileNameList = new ArrayList<String>();
if(null != files && files.size() > 0){
for(MultipartFile multipartFile : files){
String fileName = multipartFile.getOriginalFilename();
fileNameList.add(fileName);
File imageFile = new File(request.getRealPath("/image"),fileName);
try {
//将内容复制到imageFile中,做进一步处理
multipartFile.transferTo(imageFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return "productDetails";
}
}
- 修改SpringMVC配置文件
添加一下两个bean,用于支持springMVC的文件上传
<bean id="messageSource" class="org.springframework.context.
support.ReloadableResourceBundleMessageSource">
<property name="basename" value="/WEB-INF/resource/messages"/>
</bean>
<!-- 添加处理文件上传的bean -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="2000000"/>
</bean>
- 页面表单
页面表单中的书写方式与大多数文件上传类似
<input type="file" name="images[0]">
<input type="file" name="images[1]"/>
.....
注意的是name属性要与Domain中的用于封装文件对象的List<MultipartFile>
名称一致,后面以数组的形式表示它 下标。