文件上传
springmvc中对多部件类型解析
在页面form中提交enctype="multipart/form-data"的数据时,需要springmvc对multipart类型的数据进行解析。
准备:
导入上传jar包:commons-fileupload和commons-io
在springmvc.xml中配置multipart类型解析器
<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
创建图片的虚拟目录来存储图片(模拟图片服务器)
通过图形界面配置:
通过修改tomcat的server.xml配置:
添加:<Context docBase="F:devlopupload emp" path="/pic" reloadable="false"/>
配置好后,我们可以通过tomcat服务器使用虚拟路径访问我们的对应图片,如:
http://localhost:8080/pic/2.jpg
注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。
上传图片代码:
@RequestMapping(...)
public String editItemsSubmit(Model model, HttpServletRequest request, Integer id, @ModelAttribute("items") @Validated(value={ValidateGroup1.class}) ItemsCustom itemsCustom, BindingResult bindingResult, MultipartFile items_pic) 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("items",itemsCustom);
//上传图片
if(items_pic != null){
//存储图片的物理路径
String pic_path = "F:\devlop\upload\temp\";
//原始名称
String originalFilename originalFilename=items_pic.getOriginalFilename();
//新的图片名称
StringnewFileName= UUID。randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
//试着分级创建一下目录
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
File parents=new File(pic_path+calendar.YEAR+"/"+(calendar.MONTH+1)+"/"+calendar.DAY);
if(!parents.exisit){
parents.mkdirs();
}
//新图片
File newFile = new File(parents,newFileName);
//将内存中的数据写入磁盘
items_pic.transferTo(newFile);
//将新图片名称写到itemsCustom中
itemsCustom.setPic(newFileName);
}
//调用service更新商品信息,页面需要将商品信息传到此方法
itemsService.updateItems(id, itemsCustom);
return success;
}
页面:
<td>商品图片</td>
<td>
<c:if test="${item.pic != null}">
<img src="/pic/${item.pic}" width=100 height=100 />
</c:if>
<input type="file" name="items_pic"/>
</td>