zoukankan      html  css  js  c++  java
  • springMVC学习(10)-上传图片

    需求:在修改商品页面,添加上传商品图片功能。

    SpringMVC中对多部件类型解析:

    1)springmvc中配置:

    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>
    View Code

    需要加入的jar包:(上边的解析器就是使用下面的jar包进行图片上传)

     commons-fileupload-1.2.2.jar;

    commons-io-2.4.jar

    2)editItems.jsp中form的enctype要设置为“multipart/form-data”;

     1 <%@ page language="java" contentType="text/html; charset=UTF-8"
     2     pageEncoding="UTF-8"%>
     3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     4 <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
     5 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
     6 <html>
     7 <head>
     8 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     9 <title>修改商品信息</title>
    10 
    11 </head>
    12 <body> 
    13 
    14 <!-- 显示错误信息 -->
    15 <c:if test="${allErrors!=null}">
    16     错误信息:<br/>
    17     <c:forEach items="${allErrors}" var="error">
    18         ${error.defaultMessage}<br/>
    19     </c:forEach>
    20 </c:if>
    21 
    22 <form id="itemForm" action="${pageContext.request.contextPath }/items/editItemsSubmit.action" method="post" enctype="multipart/form-data">
    23 <input type="hidden" name="id" value="${items.id }"/>
    24 修改商品信息:
    25 <table width="100%" border=1>
    26 <tr>
    27     <td>商品名称</td>
    28     <td><input type="text" name="name" value="${items.name }"/></td>
    29 </tr>
    30 <tr>
    31     <td>商品价格</td>
    32     <td><input type="text" name="price" value="${items.price }"/></td>
    33 </tr>
    34 <tr>
    35     <td>商品生产日期</td>
    36     <td><input type="text" name="createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
    37 </tr>
    38 <tr>
    39     <td>商品图片</td>
    40     <td>
    41         <c:if test="${items.pic !=null}">
    42             <img src="/pic/${items.pic}" width=100 height=100/>
    43             <br/>
    44         </c:if>
    45         <input type="file"  name="items_pic"/> 
    46     </td>
    47 </tr>
    48 <tr>
    49     <td>商品简介</td>
    50     <td>
    51     <textarea rows="3" cols="30" name="detail">${items.detail }</textarea>
    52     </td>
    53 </tr>
    54 <tr>
    55 <td colspan="2" align="center"><input type="submit" value="提交"/>
    56 </td>
    57 </tr>
    58 </table>
    59 </form>
    60 </body>
    61 </html>
    View Code

    3)controller中代码:

    这里是设置tomcat的虚拟目录的:在tomcat中图片访问路径是/pic,真实的物理地址是D:uploadimages;

    对应tomcat conf/server.xml中的配置是:

    <Context docBase="D:uploadimages" path="/pic" reloadable="false"/>

    Contorller处理上传文件,并将文件名设置到数据库代码:

     1 //商品信息修改提交
     2     @RequestMapping("/editItemsSubmit")
     3     public String editItemsSubmit(Model model,
     4                                   HttpServletRequest request,
     5                                   Integer id, 
     6                                   @Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult,
     7                                   MultipartFile items_pic)
     8                                  throws Exception {
     9         if(bindingResult.hasErrors()){
    10              List<ObjectError> allErrors = bindingResult.getAllErrors();
    11              for(ObjectError objectError : allErrors){
    12                  System.out.println(objectError.getDefaultMessage());
    13              }
    14              
    15             // 将错误信息传到页面
    16             model.addAttribute("allErrors", allErrors);
    17             
    18             //可以直接使用model将提交pojo回显到页面
    19             model.addAttribute("items", itemsCustom);
    20             
    21             return "items/editItems";
    22         }
    23         
    24         String originalFilename = items_pic.getOriginalFilename();
    25         
    26         if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){
    27             String pic_path = "D:\upload\images\";
    28             String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
    29             
    30             //新图片
    31             File newFile = new File(pic_path + newFileName);
    32             
    33             items_pic.transferTo(newFile);
    34             
    35             itemsCustom.setPic(newFileName);
    36         }
    37         
    38         itemsService.updateItems(id, itemsCustom);
    39         return "success";
    40     }
    View Code

    上传图片成功:

    4)修改代码将图片上传到项目路径中WebRoot/resources/images:

     新建存放图片的文件夹:

    我这边先是在web-inf下面放的图片;工程是发布在org.eclipse.wst.server.core mp0wtpwebapps下面;做了好几次实验,页面上就是不能展示修改后的图片;

    后来把工程发布在tomcat的安装目录、资源文件放在项目根路径/WebRoot下面resources的;

        //商品信息修改提交
        //MultipartFile 接收商品图片
        @RequestMapping("/editItemsSubmit")
        public String editItemsSubmit(Model model,
                                      HttpServletRequest request,
                                      Integer id, 
                                      @Validated(value={ValidGroup1.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);
                
                return "items/editItems";
            }
            
            //文件原始名称
            String originalFilename = items_pic.getOriginalFilename();
            
            if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){
                
                /*
                 * 1  这里上传到tomcat部署环境下面的WebRoot/resources/images/下面了
                 * 因为真正项目部署后运行环境,这里就想传到这个下面;
                 */
                String basePath = request.getServletContext().getRealPath("resources/images/");
                System.out.println("文件保存路径--------------------------->>" + basePath);
                //String basePath = request.getServletContext().getRealPath("WEB-INF/resources/images/");
                //E:jdbcWorkspace.metadata.pluginsorg.eclipse.wst.server.core	mp0wtpwebappsspringMVCWEB-INF
    esourcesimages
                
                /* 2   1和2的效果是一摸一样;
                System.out.println("类名:-------------------------------" + this.getClass().getName());
                //ItemsController
                String basePath = this.getClass().getClassLoader().getResource("../../WEB-INF/resources/images/").getPath();
                System.out.println("文件保存路径--------------------------" + basePath);
                //E:jdbcWorkspace.metadata.pluginsorg.eclipse.wst.server.core	mp0wtpwebappsspringMVCWEB-INF
    esourcesimages
                */
                
                //新的图片名称
                String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
                
                //新图片
                File newFile = new File(basePath + newFileName);
                
                //将内存中的数据写入磁盘
                items_pic.transferTo(newFile);
                
                itemsCustom.setPic(newFileName);
            }
            
            itemsService.updateItems(id, itemsCustom);
            return "success";
        }

    springmvc.xml中配置了静态资源访问:

    看到说这个的前提是配置了注解驱动:mvc:annotation-driven

    1  <!-- 对静态资源文件的访问 
    2          mapping:映射
    3          两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)
    4          location:本地资源路径,默认是webapp根目录下的路径。
    5          WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
    6      -->
    7      <mvc:resources mapping="/resources/**" location="/resources/" />

    editItems.jsp:

    <tr>
        <td>商品图片</td>
        <td>
            <c:if test="${items.pic !=null}">
                <img src="${pageContext.request.contextPath }/resources/images/${items.pic}" width=100 height=100/>
                <br/>
            </c:if>
            <input type="file"  name="items_pic"/> 
        </td>
    </tr>

    页面上再上传图片,能够看到:

    图片保存在tomcat/webapps/springMVC/resources/images下面:

  • 相关阅读:
    jquery.ajax,vue-resource,axios拦截器实现与携带cookie
    vs code 常用插件及说明
    Js/Jquery获取网页屏幕可见区域高度(转)
    vue的爬坑之路(三)之-----基于vue-cli的VueAwesomeSwiper轮播滑块插件的使用及常见问题(转)
    js中的深拷贝与浅拷贝
    沉浸式状态栏 关于状态栏高度的获取
    Cordova 常用命令及插件(转)
    video control
    canvas添加水印
    疑惑
  • 原文地址:https://www.cnblogs.com/tenWood/p/6337070.html
Copyright © 2011-2022 走看看