1. 程式人生 > >在vue專案中實現註冊時改變頭像,同時實現將圖片上傳的伺服器端

在vue專案中實現註冊時改變頭像,同時實現將圖片上傳的伺服器端

 一.如何實現在註冊時點選頭像時實現更改圖片的操作

     1.將img和input[type="file"]放在同一個div中,利用絕對定位,讓兩者擁有相同的大小,將input的預設樣式變為透明,讓img覆蓋的input之上;img中有一個屬性,accept,可以指定上傳的img的格式

         accept=“image/gif,image/jpg”...  可以指定圖片的格式

        accept="image/*"表示可以接受任何格式,不限制圖片的格式

       <div class="avatar-right">

           <img id="avatarImg" :src="chaAvatar" width="80" height="80" alt="點選更換頭像" accept="image/*">

          <input type="file" id="avatarInput" @change="changeAvatar" name="mypic" ref="fileUpload" capture="camera">

      </div>

     2.將頭像顯示出來     

changeAvatar(e){

    //將頭像的檔案上傳到後臺的伺服器端

    var form = new FormData();

    form.append('mypic',this.$refs.fileUpload.files[0]);

    console.log(this.$refs.fileUpload.files[0]);

    axios({

        method:'post',

      url:'http://172.242.10.36:3001/user/upload',

      anync:true,

     contentType:false,

     processData:false,

     data:form

    }).then((res)=>{

       if(res.data.code == 1){

         this.avatar = res.data.msg;

      }

   })

 

   let $target = e.target || e.srcElement

   let file = $target.files[0];

   //console.log(file.name.indexOf(".jpg"));

   if(file.name.indexOf(".jpg")!=-1 || file.name.indexOf(".png")!=-1 || file.name.indexOf(".gif") !=-1 || file.name.indexOf(".jpeg") !=-1){

      this.avatar = file.name;

      var reader = new FileReader()

       reader.onload = (data) => {

            let res = data.target || data.srcElement

            this.chaAvatar = res.result

       }

      reader.readAsDataURL(file)

     }else{

         Toast("圖片的格式不正確");

      }

  }

解釋:

    let $target = e.target || e.srcElement 表示呼叫它的各種屬性

        兩個的區別:

             ie下支援e.srcElement

             ff下支援e.target

     let file  = $target.files[0]表示取第一張圖 

     FileReader()物件允許web應用程式非同步讀取儲存在使用者計算機上的檔案(或原始資料緩衝區)的內容,使用File或Blob物件指定要讀取的檔案或資料。其中File物件可以是來自使用者一個<input>元素上選擇檔案後返回的FileList物件,也可以來自拖放操作生成的DataFransfer物件,還可以是來自一個HTMLCanvasElement上執行mozGetFile()方法後返回結果。

3.服務端接收客戶端上傳的檔案並儲存在伺服器端

     //在nodejs中引入第三方模組multer

     const multer = require("multer");

     //建立上傳檔案物件,並確定儲存的目錄

     var upload = multer({dest: '../public/img/person/'});

     //功能四:當改變圖片時,儲存在伺服器端

     router.post("/upload",upload.single("mypic"),(req,res)=>{

          var file = req.file;

         //console.log(req.file);

         //建立新檔名

         //獲取原有檔名字尾 1.jpg

         var srcFile = file.originalname;

         var i1 = srcFile.lastIndexOf(".");

         var len = srcFile.length;

         var suffix = srcFile.substring(i1,len);

        //時間戳+隨機數+字尾

        var fileName = new Date().getTime()+Math.floor(Math.random()*9999)+suffix

        var newFileName = './public/img/person/'+fileName;

       //將臨時檔案移動upload目錄

       //fs.renameSync() 阻塞(同步)

       fs.renameSync(file.path,newFileName);

       res.send({code:1,msg:fileName});

})