1. 程式人生 > >AngularJS之手機端input圖片上傳

AngularJS之手機端input圖片上傳

吶,好久不見,今天要說的是input上傳圖片,主角上場~
<input type="file" capture="camera" accept="image/*">
其實只要type="file"這個屬性就夠了,但是由於這邊是在手機上訪問,要能夠調起手機的照相機和相簿,所以就需要有後面的屬性了。

現在如果我已經在相簿選擇一張圖片了,那怎麼獲取圖片資料呢?
傳統做法就是加上onchange事件,但是由於使用的是angularjs,按道理應該用ng-change事件,不幸的事,並不觸發…實際上onchange是可以觸發的,但是並不能找到controller裡對應的事件處理方法…
程式碼裡寫上 onchange=“uploadDown()”,controller裡也有對應事件,但是報錯:
這裡寫圖片


救命…

冥冥之中感覺需要用指令了,在stackoverflow上找到下面這個,就不費腦細胞造輪子啦,哈哈~

app.register.directive('inputOnChange', function(){
  return{
    restrict: 'A',
    link: function (scope, element, attrs) {
      var onChangeFunc = scope.$eval(attrs.inputOnChange);
      element.bind('change', onChangeFunc);
    }
  }
});

下來在input上加上這個屬性就ok了:

<input type="file" capture="camera" accept="image/*" input-on-change="uploadDown">

controller裡事件:

$scope.uploadDown = function () {
      var file = event.target.files[0].name;
      alert('選擇的檔名稱:'+file);
    }

以上取到的是檔案的名字,很明顯,只有檔名可不夠哇,有的同學可能需要base64?

h5裡有個FileReader物件,可以獲取各種資訊…
當然用之前最好還是判斷下當前瀏覽器是否支援:

if(type of FileReader === 'undefined'){
	alert('不支援');
}

ok,完善一下uploadDown()事件:

 $scope.uploadDown = function () {
      var file = event.target.files[0];
       //判斷型別是不是圖片
      if (!/image\/\w+/.test(file.type)) {
        alert("非圖片");
        return;
      }
      var reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = function (e) {
	      alert(this.result);//base64
      }
    }

順便說下FileReader的方法:
readAsBinaryString(file) ------ 將檔案讀取二進位制碼
readAsText(file,[encoding]) ------ 將檔案讀取文字(encoding預設UTF-8)
readAsDataURL(file) ------ 將檔案讀取為DataURL
abort() ------- 中斷讀取操作

以及FileReader的事件:
onabort ---------資料讀取中斷時觸發
onerror ---------資料讀取出錯時觸發
onloadstart --------資料讀取開始時觸發
onprocess --------資料讀取中
onload --------資料讀取成功完成時觸發
onloadend --------資料讀取完成時觸發,無論成功失敗

很明顯,我這邊用的是onload和readAsDataURL(file)
好啦,到目前為止,該取的都取到了,下來就可以用$resource將資料傳給後端服務了~

可能有些同學還是不滿意,因為當前雖然能獲取到所選圖片的資料,但是隻存在於js端,如果需要給使用者預覽呢?

   $scope.uploadDown = function () {
      var file = event.target.files[0];
      $scope.imgSrc=window.URL.createObjectURL(file);//這個方法只支援火狐類,手機上沒人用IE吧,哈哈哈
    };
 <img src="{{imgSrc}}" style="display: block; width: 200px; height: 150px;">

以上即可。