文件上传与下载[springmvc+spring+mybatis]
jar包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
1. 在springmvc.xml中配置文件上传解析器
1 <!-- 配置文件上传解析器 --> 2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 3 <!-- 设置文件上传的最大尺寸为5MB --> 4 <property name="maxUploadSize"> 5 <value>5242880</value> 6 </property> 7 </bean>
2. 在实际开发中, 有专门存放图片的图片服务器[虚拟目录], 但是这里没法展示, 仅在tomcat服务器下创建一个虚拟目录作为存放图片的目录
以下操作在eclipse中操作的, 在myeclipse中暂时找不到以下的操作页面
双击Tomcat服务器-->页面切换到Modules, 点击Add External Web Module...-->路径指向存放图片的目录[这个称为物理路径],
在path中填写访问该目录的路径/pic [这个称为虚拟目录]
以上操作还可以在tomcat的conf目录下的server.xml中配置:
测试是否配置成功, 启动tomcat, 在地址栏输入http://localhost:8080/pic/heart.jpg, 可以访问到该虚拟目录下的文件, 说明配置成功:
注意: 在图片虚拟目录中, 一定要将图片目录分级创建, 这样可以提高 i/o 性能, 一般我们按日期(年、月、日)进行分级创建
3. 在Handler中编写代码:
1 @RequestMapping("/editItemsSubmit") 2 public String editItemsSubmit(Integer id, Model model, 3 @Validated(value={ValidateGroup1.class}) ItemsCustom itemsCustom, 4 BindingResult bindingResult, 5 MultipartFile items_pic // 接收商品图片 6 ) throws Exception {
1 // 上传图片[注意: 1. mysql数据库中只是存放图片的新的名称(如果做得更好, 还要存放旧的图片名称, 2 // 这样用户在上传图片的时候名字可以自定义命名, 而且在下载的时候可以根据名字下载, 只是中间我们把名字转换了一下) 3 // 2. 图片服务器(在已经设置的物理路径之中)存放的是用户上传的图片 3. 通过mysql数据库查找图片名称然后去图片 4 // 服务器的物理路径中可以找到对应的图片] 5 if (items_pic != null) { 6 7 // 存储图片的物理路径 8 String pic_path = "F:\\frame\\temp\\"; 9 10 // 图片的原始名称, 用于生成新的图片名称 11 String originalFilename = items_pic.getOriginalFilename(); 12 // 新的图片名称 13 String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf(".")); 14 15 // 新图片路径 16 File newFile = new File(pic_path + newFileName); 17 18 // 将内存中的图片数据写入磁盘 19 items_pic.transferTo(newFile); 20 21 // 将新图片名称写到itemsCustom中 22 itemsCustom.setPic(newFileName); 23 }
4. 页面代码:
1 <tr><td>商品图片</td> 2 <td> 3 <!-- 展示图片, 路径: 先从mysql数据库中获取图片的名称, 然后定位到设置的虚拟目录中, 找到图片 --> 4 <c:if test="${items.pic != null }"> 5 <img alt="${items.name }" src="/pic/${items.pic }" width="100" height="100"> 6 <br> 7 </c:if> 8 <!-- 用户上传图片控件, name要和Handler中的MultipartFile items_pic名称一致 --> 9 <input type="file" name="items_pic"/> 10 </td> 11 </tr>
除此之外, 还要在表单的头部设置成多部件类型
1 <form action="${pageContext.request.contextPath }/items/editItemsSubmit.action" 2 method="post" enctype="multipart/form-data">
测试:
页面
数据库
虚拟目录
总结:
1. 图片上传有专门的图片服务器管理, 目录下应该按照时间(年、月、日)来分级创建文件目录
2. Mysql只保存文件的名称(包括原始名称和新的图片名称)
3. 从数据库获取图片名称, 然后+图片服务器的目录就可以获取对应的图片