文件上传与下载[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. 从数据库获取图片名称, 然后+图片服务器的目录就可以获取对应的图片

 

posted @ 2017-03-23 21:39  半生戎马,共话桑麻、  阅读(149)  评论(0)    收藏  举报
levels of contents