基于ssm的上传图片

原创地址:http://blog.****.net/qq_33764491/article/details/77440180

第一次接触上传图片,自己还是很头疼的。大佬的帮助和网上的资料着实帮了我不少的忙~~所以,下面是我实现这个功能的思路。

用户注册时,需要上传图片(头像),这是该功能的背景。在实现之前,需要导入两个jar包:commons-fileupload-1.3.1和commons-io-2.4。

首先是jsp页面:

[html] view plain copy
  1. <form action="file/upload.action" method="post" enctype="multipart/form-data">  
  2.  <label>用户名:</label><input type="text" name="name"><br>  
  3.  <label>密码:</label><input type="password" name="pwd"><br>  
  4.  <label>上传头像:</label><input type="file" name="file"><br>  
  5.  <input type="submit">  
  6.  </form>  

需要注意的是,一定要写 enctype="multipart/form-data",否则springmvc就会解析失败。这个的作用就是将form表单的数据以二进制的方式传输。

配置springmvc.xml:

[html] view plain copy
  1. <!-- 上传文件 -->    
  2.     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    
  3.     <property name="defaultEncoding" value="utf-8"/>    
  4.     <!-- 最大内存大小 -->    
  5.     <property name="maxInMemorySize" value="10240"/>    
  6.     <!-- 最大文件大小,-1为不限制大小 -->    
  7.     <property name="maxUploadSize" value="-1"/>    
  8.     </bean>    
首先,springmvc上传图片(文件)是通过MultipartResolver(Multipart解析器)处理的,对于MultipartResolver而言它只是一个接口,它有两个实现类。CommonsMultipartResolver和StandardServletMultipartResolver。我用的是前者,它可以在spring的各个版本使用,但是需要依赖第三方包才能实现,而后者不依赖第三方包,但是要求sping版本在3.1以上。

po和mapper我是利用****自动生成的,所以不再书写。需要注意的是:我将MultipartFile定义在实体类中。

[java] view plain copy
  1. public class User {  
  2.     private Integer id;  
  3.   
  4.     private String name;  
  5.   
  6.     private String pwd;  
  7.       
  8.     private String image;  
  9.       
  10.     private MultipartFile file;  
controller:
[html] view plain copy
  1. @Controller  
  2. @RequestMapping("/file")  
  3. public class UserController {  
  4.   
  5.     @Autowired  
  6.     IUserService userService;  
  7.       
  8.     @RequestMapping("/upload")  
  9.     public String upload(User user,HttpServletRequest request,Model model) throws Exception{  
  10.     System.out.println(request.getParameter("name"));  
  11.       //保存数据库的路径  
  12.       String sqlPath = null;   
  13.       //定义文件保存的本地路径  
  14.       String localPath="D:\\File\\";  
  15.       //定义 文件名  
  16.       String filename=null;    
  17.       if(!user.getFile().isEmpty()){    
  18.           //生成uuid作为文件名称    
  19.           String uuid = UUID.randomUUID().toString().replaceAll("-","");    
  20.           //获得文件类型(可以判断如果不是图片,禁止上传)    
  21.           String contentType=user.getFile().getContentType();    
  22.           //获得文件后缀名   
  23.           String suffixName=contentType.substring(contentType.indexOf("/")+1);  
  24.           //得到 文件名  
  25.           filename=uuid+"."+suffixName;   
  26.           System.out.println(filename);  
  27.           //文件保存路径  
  28.           user.getFile().transferTo(new File(localPath+filename));    
  29.       }  
  30.       //把图片的相对路径保存至数据库  
  31.       sqlPath = "/images/"+filename;  
  32.       System.out.println(sqlPath);  
  33.       user.setImage(sqlPath);  
  34.       userService.addUser(user);  
  35.       model.addAttribute("user", user);  
  36.       return "MyJsp";  
  37.     }  
用户上传的图片保存在相应的服务器中(由于自己测试,设置了Apache的虚拟目录,所以讲图片保存在本地硬盘(D盘新建的File目录)下),在数据库中只保存图片的相对路径。

Apache虚拟目录的设置:

    在Apache的server.xml 下的<host></host>标签中,添加即可:

              <Context docBase="D:\File"  path="/images" reloadable="false"/>

MyJsp:

[html] view plain copy
  1. <h3>显示图片</h3>  
  2.   <img src="${basePath}${user.image}">用户名:${user.name}  
  3.   <hr>  
附数据库的设计:

基于ssm的上传图片

实现结果:

基于ssm的上传图片

基于ssm的上传图片


基于ssm的上传图片


—————————————————————————————————————————————————————————————————————————————9.14更新+改进

注意这个坑,如果你用了逆向的方法selective,进行更新时,会出现无法更新成功的问题,原因就是之前写的是" ",而真正应该是null !

基于ssm的上传图片

//把图片的相对路径保存至数据库 
      sqlPath = filename;
      if(sqlPath!=null){
           user.setUlogo(sqlPath);  
      }

在页面这样实现<img src="/images/${pacth}">