• MySQL+SSM+Ajax上传图片问题


      第一次写上传图片的代码,碰到很多问题。昨天做了整整一天,终于在晚上的时候成功了。大声欢呼。

    但是,做完之后,还是有很多问题想不通。所以在这里也算是写个笔记,日后忘记了可以回顾,也算请教各路朋友。(^_^)

      Q.1. 网上说Ajax不能上传文件,但是这个说法并不是很多,也还是有蛮多通过Ajax上传文件的分享。

    我也没有通过Ajax做出来,最后是通过AjaxSubmit这个方法写的。

      Q.2. AjaxSubmit这个方法对文件上传的大小有默认限制吧。我选择大于100KB的文件上传就不能成功,小于100KB的就可以成功。

    上传大于100KB的时候,浏览器console返回下面的提示。说明他还是执行了ajaxSubmit的success方法,并返回textStatus的值为success,

    但是XMLHttpRequest, 和 errorThrown的responseText返回的HTML代码内容是我在spring-web.xml配置的异常处理视图网页。

    js代码(提交表单事件):

     1 function postImg(){
     2     if ($.trim($("#imgFile").val()) == "") {  
     3             alert("请选择图片!");  
     4             return;  
     5         }  
     6     console.log($("#imgFile")[0].files[0].size);//小于100*1024,下面的请求就可以成功
     7     var option = {
     8         url : '/cloudnote/user/insertUserPhoto.do',
     9         type : 'POST',
    10 //     dataType : 'json',
    11         headers : {"ClientCallMode" : "ajax"}, //添加请求头部
    12         success : function(XMLHttpRequest, textStatus, errorThrown){
    13             console.log(XMLHttpRequest);
    14             console.log(textStatus);
    15             console.log(errorThrown);
    16             console.log("前端输出上传成功");
    17             $("#imgClose").click();
    18         },
    19         error: function(XMLHttpRequest, textStatus, errorThrown) {
    20             console.log(XMLHttpRequest);
    21             console.log(textStatus);
    22             console.log(errorThrown);
    23             console.log("前端输出上传失败"); 
    24         }
    25     };
    26     $("#imgForm").ajaxSubmit(option);
    27     return false; 
    28 
    29     
    30 }

    前端HTML表单:

     1 <form id="imgForm"  > 
     2   <div class="modal-content">
     3       <div class="modal-header">
     4           <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
     5           <h4 class="modal-title" id="myModalLabel">修改头像</h4>
     6        </div>
     7        <div class="modal-body">
     8          <input type="file" id="imgFile" name="imgFile"/> 
     9           <input id="imgId" name="userId" value="${user.id }" style="display:none" />
    10        </div>
    11        <div class="modal-footer">
    12          <button type="button" class="btn btn-default" data-dismiss="modal" id="imgClose">关闭</button>
    13            <button type="button" class="btn btn-primary" onclick="postImg();" id="imgSubmit">上传</button>
    14        </div>
    15    </div>
    16 </form>  

    下面是后台的java代码(Controller)

     1    //更新用户头像
     2     @RequestMapping(value="/insertUserPhoto.do",method = RequestMethod.POST)
     3     public void insertUserPhoto(
     4             HttpServletRequest req, HttpServletResponse res){
     5     
     6         System.out.println("----- 插入图片 -------");
     7         try{
     8             String id = req.getParameter("userId"); 
     9             System.out.println(id);
    10             MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) req;
    11 
    12             MultipartFile file  =  multipartRequest.getFile("imgFile");
    13             byte[] photo = file.getBytes();
    14             boolean result = serv.insertUserPhoto(id, photo);  
    15             res.setContentType("text/html;charset=utf8");  
    16             res.getWriter().write("result:" + result);     
    17             
    18         }catch(Exception e){
    19             e.printStackTrace();
    20         }
    21         System.out.println("----- 插入图片end -------");
    22     }
    23     /**
    24      * 读取用户头像
    25      * @param req
    26      * @param res
    27      */
    28     @RequestMapping(value="/readPhoto.do", method=RequestMethod.GET)
    29     public void readPhoto(HttpServletRequest req, HttpServletResponse res){
    30         System.out.println("------readPohto-----");
    31         String id = Utils.getSessionUserId(req);
    32         
    33         try {
    34             User user = serv.selectUserPhoto(id);
    35 
    36             res.setContentType("image/jpeg");
    37             res.setCharacterEncoding("utf-8");  
    38             
    39             OutputStream outputStream = res.getOutputStream();  
    40             InputStream in = new ByteArrayInputStream(user.getPhoto());  
    41            
    42             int len = 0;  
    43             byte[] buf = new byte[1024];  
    44             while((len = in.read(buf,0,1024)) != -1){  
    45                 outputStream.write(buf, 0, len);
    46             }  
    47             outputStream.close();  
    48         } catch (IOException e) {  
    49             e.printStackTrace();  
    50         } 
    51         System.out.println("-----readPohto end-----");
    52         return;
    53     }

    Service实现类

     1   //查找用户图片(头像)
     2     public User selectUserPhoto(String id) throws ImageException {
     3         User user = userDao.findUserById(id);
     4         if(user == null){
     5             throw new UserNameException("用户名不存在!");
     6         }
     7         
     8         Map<String, Object> data = userDao.selectUserPhoto(id);
     9         System.out.println(data);
    10         user.setPhoto((byte[]) data.get("photo"));
    11         
    12         return user;
    13     }
    14     //更新用户图片(头像)
    15     public boolean insertUserPhoto(String userId, byte[] photo) throws ImageException, UserNameException {
    16         if(userId == null || userId.trim().isEmpty()){
    17             throw new UserNameException("用户id不存在");
    18         }
    19         
    20         User user = userDao.findUserById(userId);
    21         if(user == null){
    22             throw new UserNameException("用户不存在");
    23         }
    24         
    25         user.setPhoto(photo);
    26         int n = userDao.updateUserPhoto(user);
    27         System.out.println("插入图片:" + n);
    28         return n==1?true:false;    
    29     }

    实体类User的photo 是 byte[] 类型的;

    数据库的photo是 longblob:

    mapper映射器:

     1   <!-- 更新图片 -->
     2     <update id="updateUserPhoto" parameterType="cn.tedu.note.entity.User">  
     3         UPDATE user set id = #{id}, photo = #{photo,jdbcType=BLOB} <!-- 这里试了,如果不加jdbcType=BLOB 会出错,虽然不是很理解,但也照做了 --> 
     4         WHERE id = #{id}
     5     </update>  
     6     <!-- 获取图片 -->
     7     <select id="selectUserPhoto" parameterType="String" resultType="Map">  
     8             SELECT  id as id, photo as photo from user 
     9             WHERE   id=#{id}  
    10     </select>  

    Spring-web.xml配置

    1 <!-- 文件上传表单的视图解析器 -->  
    2  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">   
    3      <property name="maxUploadSize"><value>100000</value></property> 
    4      <property name="defaultEncoding"><value>UTF-8</value></property> 
    5  </bean> 
  • 相关阅读:
    数据库连接字符串
    搭建消息队列
    Linux---江湖
    Bundle压缩JS和CSS
    DDD分层架构之仓储
    UI控件库
    图解Http协议 url长度限制
    JAVA jdbc(数据库连接池)学习笔记(转)
    领域驱动设计(DDD)部分核心概念的个人理解(转)
    怎样的中奖算法能让人信服(转)
  • 原文地址:https://www.cnblogs.com/hxliang/p/6557892.html
Copyright © 2020-2023  润新知