示例:在修改商品页面,添加上传商品图片功能
1、springmvc中对多部件类型的解析
在页面form中提交enctype=”multipart/form-data”的数据时,需要springmvc对multipart类型的数据进行解析。
需要在springmvc.xml中配置multipart的解析器,才能进行解析
<!-- 配置 文件上传 解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
2、 添加上传文件所需要的 jar 包,下载地址:点击打开链接
3、创建图片的虚拟目录
方式一:通过eclipse的图形界面来创建
方式二:通过修改tomcat中的配置文件来创建
在conf/server.xml中的Host节点下添加<Context docBase="G:\MyProject\temp" path="/pic" reloadable="false"/>
注意:在虚拟图片的虚拟目录中,一定将图片目录分级创建(作用:提供i/o性能),一般我们采用按照(年、月、日)进行分级创建
4、编写上传文件的代码
表现层实现:
<tr>
<td>商品图片</td>
<td>
<c:if test="${itemsCustom.pic != null }">
<input type="hidden" name="pic" value="${itemsCustom.pic }"/>
<img src="/pic/${itemsCustom.pic }" width="100" height="100"/>
<br />
</c:if>
<input type="file" name="<span style="background-color: rgb(255, 255, 51);">items_pic</span>"/>
</td>
</tr>
controller方法中实现代码:
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(Model model,HttpServletRequest request,Integer id,String name,
@ModelAttribute("items") @Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,
BindingResult bindingResult,
MultipartFile <span style="background-color: rgb(255, 255, 51);">items_pic</span>//接收商品图片
) throws Exception{
//获取校验错误信息
if(bindingResult.hasErrors()){//如果有错误
//输出错误信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
for (ObjectError objectError : allErrors) {
//输出错误信息
System.out.println(objectError.getDefaultMessage());
}
//将错误信息传到页面
model.addAttribute("allErrors", allErrors);
//可以直接使用model将提交的pojo回显到页面
model.addAttribute("itemsCustom",itemsCustom);
//出错后重新回到商品的修改页面
return "items/editItems";
}
//上传图片
if(items_pic != null){
//上传图片的原始名称
String originalFilename = items_pic.getOriginalFilename();
if(originalFilename != null && originalFilename.length() > 0){
//存储图片的物理路径
String pic_path = "G:\\MyProject\\temp\\";
//创建新的图片名称 UUID.randomUUID():随机数 + 扩展名
String newFilename = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
//新的图片
File newfile = new File(pic_path+newFilename);
//将内存中的数据写入磁盘
items_pic.transferTo(newfile);
//结束上传
//将新的图片名称写到itemsCustom属性中
itemsCustom.setPic(newFilename);
}
}
//调用service更新商品信息,页面需要将商品新传到此方法
itemsService.updateItems(id, itemsCustom);
//重定向到商品的查询列表
return "redirect:queryItems.action";
}
注意:controller形参中的MultipartFile变量名称要与页面中文件控件的名称一致。