附件上传——mysql blob类型的数据(springboot)1

  做为一个初出茅庐的菜鸟,这几天作了一下附件的上传与下载,附件文件存储在mysql中,数据类型为blob。在此作一下总结。望指正。前端

  一.先总结附件的上传。(实质是将文件传到controller,后处理成二进制数据 才可以保存到数据库blob数据中)mysql

      个人目的是将文件保存在mysql的某一条记录中,须要经过页面上传文件到后台。ajax

      1.经过页面进行文件的上传,使用ajax,经过form表单以formData来将文件上传,删除没必要要的内容。spring

        前台代码:<form id="file"  method="post" action="{{url}}" enctype="multipart/form-data">sql

               <div class="file-container">数据库

                  <button  type="button" onclick="">上传</button>数组

                  <input type="file" name="file" id="file1" onchange="loadFile(this.files[0])" style="position: absolute; top: 0; left: 0; opacity: 0">springboot

               </div>app

               <button class="btn btn-primary" id="excelImp" type="button">导入</button>async

              </form>            

    $('#excelImp').click(function(){
      var formData = new FormData();

      /*var formData = new FormData($("#file")[0]);*/  序列化表单的一种作法,能够上传文件。  
      var file = $('#file1').get(0).files[0];
      formData.append("id",rows[0].taskId)
      formData.append("file",file)
      $.ajax({
          url : " ",
          type : "POST",
          data :formData,
          async : false,
          cache : false,
          contentType : false,//必须false才会自动加上正确的Content-Type
          processData : false,//必须false才会避开jQuery对 formdata 的默认处理.XMLHttpRequest会对 formdata 进行正确的处理.
          success : function() {

          },
          error : function() {

          }
        })
      })

      解释一下,定义新的formData数据后,能够以键值对的形式,将想要传到后台的数据命名填入。

      要想将表单数据和文件一块儿传入到后台接收,只需在form标签中的与数据相关的标签name属性一一对应,就能够传输!

        后台代码:controller接受  参数与ajax的formData 的 key进行对应,例如@RequestParam(value = "file")MultipartFile file, @RequestParam(value = "id") String id

             这样控制器就能够接收到文件和一个id。

       控制器获取到文件和id后,我出现了一个问题:我项目使用的springboot和springcloud,在不一样模块的调度过程当中,使用了restTemplate将参数由前端模块的控制器

      传到另外一个模块的控制器,怎么尝试都没法直接将MultipartFile的文件传输,因此对其进行了处理,将file转成了字节数组,才进行了传递。(对于我来讲,为了更保险,                   我将字节数组转成了String 才进行的传输)。

          String afile = null;  InputStream ins = file.getInputStream();  byte[] buffer=new byte[1024];

          int len=0;  ByteArrayOutputStream bos=new ByteArrayOutputStream();          

            while((len=ins.read(buffer))!=-1){
              bos.write(buffer,0,len);
              }      bos.flush();  byte data[] = bos.toByteArray();  afile= new String (data);

      在实现类中接收到String 后,将其转成byte[]  经过jdbc对mysql的操做,将其插入到数据库中。

      Connection con = null;  Statement statement = null;  Statement statement = null;  

      Class.forName(driver);  con = DriverManager.getConnection(url,user,password);  

      String sql= "update XXX set XXX=?,XXX=?"+" where TASK_ID=?";

      PreparedStatement pstmt = con.prepareStatement(sql);

      pstmt.setBytes(1, data);  data为file转换成的byte[]数组,可直接存入到blob类型的数据

      pstmt.setString(2, taskReceiveAccessoryName);

      pstmt.setString(3, id);    pstmt.executeUpdate();    最后关闭数据库的链接

相关文章
相关标签/搜索