敲代碼敲到懷疑人生(html2canvas,上傳圖片,服務器讀取本地圖片)


  2017已經接近尾聲了,可是我卻懷疑人生了。。。

  (給自己一個warning的顏色,以作警醒吧)

 

最近做了一個邀請函的項目,邀請函無非就是向受邀者展示此次活動的時間、地點、活動的流程安排,最后想來的人再報個名登記一下。

這倒沒什么,重點是它后續還有一個根據用戶填寫的信息,有個生成胸卡的功能。

1.上傳圖片與圖片裁剪

胸卡當然是要上傳照片的。上傳照片的插件倒比比皆是,可是能很好地兼容Android和Ios系統的並且具有裁剪功能的就很少了。

最后我決定直接調微信的上傳圖片圖片接口。過程如下:

  1.引入js文件 http://res.wx.qq.com/open/js/jweixin-1.2.0.js

 

 

  2. 你的ajax請求的data里需要有這一項  jsApiList:'["chooseImage","uploadImage"]'

 

  3.通過config接口注入權限驗證配置 寫在ajax請求成功的回調里)

 

success:function(response){
  var _response = response.data
  var _appId =_response.appId
  var _timestamp =_response.timestamp
  var _nonceStr =_response.nonceStr
  var _signature =_response.signature
  wx.config({
    debug: false, // 開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會打印。
    appId:_appId, // 必填,公眾號的唯一標識
    timestamp:_timestamp, // 必填,生成簽名的時間戳
    nonceStr: _nonceStr, // 必填,生成簽名的隨機串
    signature:_signature, // 必填,簽名,見附錄1
    jsApiList: [
      'chooseImage',
      'uploadImage'
    ] // 必填,需要使用的JS接口列表
  });
}

 

 

##拍照或從手機相冊中選圖接口

 

wx.chooseImage({   count: 1, // 默認9   sizeType: ['original', 'compressed'], // 可以指定是原圖還是壓縮圖,默認二者都有   sourceType: ['album', 'camera'], // 可以指定來源是相冊還是相機,默認二者都有   success: function (res) {     var localIds = res.localIds; // 返回選定照片的本地ID列表,localId可以作為img標簽的src屬性顯示圖片   } });

注意:res.localIds是一個數組,數組長度等於你指定的count的值,也就是當count為1時,你想拿到src需要通過res.localIds[0]

##上傳圖片接口

wx.uploadImage({   localId: '', // 需要上傳的圖片的本地ID,由chooseImage接口獲得   isShowProgressTips: 1, // 默認為1,顯示進度提示   success: function (res) {     var serverId = res.serverId; // 返回圖片的服務器端ID   } });

上傳完成之后頁面相關區域綁定上localId就可以拿到相關圖片了;

 

然而微信上傳圖片時的裁剪功能是好多人不知道滴,有些尷尬了,最后修改了圖片上傳的區域,寬高比是1:1.333,而不是(9:16);

在這兒再推薦一款圖片裁剪的插件吧,輕量級的,並且很好用  PhotoClip.js(如果無法打開,請翻牆,或者自行下載體驗)

(http://htmlpreview.github.io/?https://github.com/baijunjie/PhotoClip.js/blob/master/demo/index.html)

 

2.本地圖片上傳到服務器

上傳圖片,裁剪圖片並不是最讓人惱火的。

把html轉成canvas,再把生成的本地圖片上傳到服務器是一個難點(

服務器讀取本地圖片,聽后台人員說必須通過二進制流的形式),於是開始了漫長的資料查閱……

 

html2canvas(document.getElementById('xcard'), {
  onrendered: function(canvas) {
    document.body.appendChild(canvas);
    var blob = getBlob(canvas);
    var oMyForm = new FormData();
    var fileName = mobile+ '.jpg'
    oMyForm.append("uploadFile", blob);
    oMyForm.append("fileName", fileName);
    oMyForm.append("fileType", 'image');
    $.ajax({
      type: "POST",
      url: BasicPath.URL + InterFaceJson.uploadSingleFile, //后台接口路徑
      data: oMyForm,
      contentType: false,
      processData: false,
      cache: false, 
      success:function(res){

      }
    });
  }
});

 

 

function getBlob(canvas){ //獲取blob對象
  var data = canvas.toDataURL("image/jpeg", 1);
  data = data.split(',')[1];
  data = window.atob(data);
  var ia = new Uint8Array(data.length);
  for(var i = 0; i < data.length; i++) {
    ia[i] = data.charCodeAt(i);
  }
  return new Blob([ia], {
    type: "image/jpeg"
  });
}

 

代碼的實現機制到現在我還是不太懂,簡單介紹一下吧。

blob是一個裝載二進制流的容器(服務器讀取時需要讀二進制流);

前后台交互不能使用jq的ajax方式,而是使用表單的提交方式。

也就是上面兩段代碼了。

 

3.html2canvas 也是一個巨坑

html2canvas官網是及其簡潔的。然而使用過程中,有太多的css樣式它是不認識的,因此html呈現的代碼和canvas生成的圖片往往會有出入,這個時候不要着急,並且需要注意它在Android和ios上的呈現區別。不要高興的太早,我們需要細心與耐心。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM