AngularJS圖片上傳功能的實(shí)現(xiàn)

一睬涧、前言

前一段時(shí)間做項(xiàng)目時(shí)蝌诡,遇到一個(gè)問(wèn)題就是AngularJS實(shí)現(xiàn)圖片預(yù)覽和上傳的功能挎春,當(dāng)時(shí)查閱文檔(都是英文文檔)折騰了很久才弄出來(lái)看疙,現(xiàn)將整個(gè)流程整理出來(lái),有需要的朋友可以參考一下直奋,如果您有更好的方法能庆,歡迎留言交流~~話不多說(shuō)直接看實(shí)現(xiàn)。

二脚线、具體實(shí)現(xiàn)

1例驹、html標(biāo)簽結(jié)構(gòu)

 <input type="file" file-model="myFile"/>
 <div class="col-md-12">
     ![]({{imageSrc}})
 </div>

input文件上傳標(biāo)簽愈诚,div包裹的img標(biāo)簽為圖片預(yù)覽區(qū)域

2拯辙、定義directive

     angular.module('app')
        .directive('fileModel', ['$parse', function ($parse) {
            return {
                restrict: 'A',
                link: function(scope, element, attrs, ngModel) {
                    var model = $parse(attrs.fileModel);
                    var modelSetter = model.assign;
                    element.bind('change', function(event){
                        scope.$apply(function(){
                            modelSetter(scope, element[0].files[0]);
                        });
                        //附件預(yù)覽
                             scope.file = (event.srcElement || event.target).files[0];
                        scope.getFile();
                    });
                }
            };
        }]);

input標(biāo)簽中的屬性file-model即就是Angular中的指令裳擎,在上面代碼的link方法中,我們?yōu)橹噶頵ile-model所在的元素綁定了change事件斯碌,change方法中獲取到要上傳的文件對(duì)象一死,并調(diào)用了controller中的getFile()方法(詳見(jiàn)controller)

3、定義控制器UploaderControler

     angular.module('app')
        .controller('UploaderController', function($scope, fileReader){
            $scope.getFile = function () {
                fileReader.readAsDataUrl($scope.file, $scope)
                              .then(function(result) {
                                  $scope.imageSrc = result;
                              });
            };
        })

控制器中定義了一個(gè)UploaderController傻唾,該控制器在其作用域中定義了getFile()方法投慈,getFile方法中調(diào)用了fileReader service中的readAsDataUrl方法,此方法中生成了圖片的地址url冠骄,并將結(jié)果返回getFile中伪煤,將返回的url賦值給$scope.imageSrc ,根據(jù)Angular雙向數(shù)據(jù)綁定的機(jī)制凛辣,img元素中ng-src屬性值為url抱既,那么就可以在頁(yè)面上預(yù)覽圖片了。fileReader service是如何定義的呢扁誓?

4防泵、定義service fileReader

   angular.module('app')
        .factory('fileReader', ["$q", "$log", function($q, $log){
            var onLoad = function(reader, deferred, scope) {
                return function () {
                    scope.$apply(function () {
                        deferred.resolve(reader.result);
                    });
                };
            };
     
            var onError = function (reader, deferred, scope) {
                return function () {
                    scope.$apply(function () {
                        deferred.reject(reader.result);
                    });
                };
            };
     
            var getReader = function(deferred, scope) {
                var reader = new FileReader();
                reader.onload = onLoad(reader, deferred, scope);
                reader.onerror = onError(reader, deferred, scope);
                return reader;
            };
     
            var readAsDataURL = function (file, scope) {
                var deferred = $q.defer();
                var reader = getReader(deferred, scope);         
                reader.readAsDataURL(file);
                return deferred.promise;
            };
     
            return {
                readAsDataUrl: readAsDataURL  
            };
        }])

fileReader service主要是完成生成獲取到的文件的url地址,返回到view進(jìn)行預(yù)覽蝗敢。

5捷泞、附件上傳的實(shí)現(xiàn)

附件上傳主要是將頁(yè)面表單數(shù)據(jù)通過(guò)后臺(tái)提供的接口寫(xiě)入到數(shù)據(jù)庫(kù)中,具體實(shí)現(xiàn)在控制器UploaderControler中增加如下代碼:

          // 組裝表單數(shù)據(jù)
            var postData = {
                vacationType: $scope.leave.type,
                reason: $scope.leave.reason,
                familyRelation: +$scope.leave.type == 7 ? $scope.leave.relation : "",
                startTime: startTime,
                endTime: endTime,
                fileName: $scope.myFile,
                workDelivers: workDelivers,
                ccmailNickNames: sendPersons,
                realDays: +$scope.leave.type == 8 ? $scope.leave.timeLong : ""
            };

            var promise = postMultipart('/maldives/leave/save', postData); 

            function postMultipart(url, data) {
                var fd = new FormData();
                angular.forEach(data, function(val, key) {
                    fd.append(key, val);
                });
                var args = {
                    method: 'POST',
                    url: url,
                    data: fd,
                    headers: {'Content-Type': undefined},
                    transformRequest: angular.identity
                };
                return $http(args);
            }

postData為表單中的數(shù)據(jù)(包括上傳的圖片信息)寿谴,'/maldives/leave/save'表示的是請(qǐng)求后臺(tái)的數(shù)據(jù)接口锁右,$http是Angular內(nèi)置的service,能向后臺(tái)發(fā)送GET或POST請(qǐng)求。

三咏瑟、對(duì)Angular中service拂到、controller、directive的認(rèn)識(shí)和理解

Service就是單例對(duì)象在AngluarJS 中的一個(gè)別名码泞。這些單例對(duì)象會(huì)被經(jīng)常傳來(lái)傳去谆焊,保證你每次訪問(wèn)到的都是同一個(gè)實(shí)例∑忠模基于這種思想,單例對(duì)象讓我們可以實(shí)現(xiàn)一些相當(dāng)酷的功能辜王,它可以讓很多controller和directive訪問(wèn)其內(nèi)部的數(shù)值劈狐。

controller把service、依賴關(guān)系呐馆、以及其它對(duì)象串聯(lián)到一起肥缔,然后通過(guò)scope把它們關(guān)聯(lián)到view上。如果在你的視圖里面需要處理復(fù)雜的業(yè)務(wù)邏輯汹来,那么把它們放到controller里面也是一個(gè)非常不錯(cuò)的選擇续膳。

Angular對(duì)directive的定義是一段代碼片段,你可以用它來(lái)操作DOM收班,也可以使用它來(lái)進(jìn)行用戶交互坟岔。

如需轉(zhuǎn)載本文,請(qǐng)注明來(lái)源: http://www.cnblogs.com/changjianqiu/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末摔桦,一起剝皮案震驚了整個(gè)濱河市社付,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邻耕,老刑警劉巖鸥咖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兄世,居然都是意外死亡啼辣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)御滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸥拧,“玉大人,你說(shuō)我怎么就攤上這事削解∽∩妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵钠绍,是天一觀的道長(zhǎng)舆声。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么媳握? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任碱屁,我火速辦了婚禮,結(jié)果婚禮上蛾找,老公的妹妹穿的比我還像新娘娩脾。我一直安慰自己,他們只是感情好打毛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布柿赊。 她就那樣靜靜地躺著,像睡著了一般幻枉。 火紅的嫁衣襯著肌膚如雪碰声。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天熬甫,我揣著相機(jī)與錄音胰挑,去河邊找鬼。 笑死椿肩,一個(gè)胖子當(dāng)著我的面吹牛瞻颂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播郑象,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贡这,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了厂榛?” 一聲冷哼從身側(cè)響起藕坯,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎噪沙,沒(méi)想到半個(gè)月后炼彪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正歼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年辐马,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片局义。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡喜爷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萄唇,到底是詐尸還是另有隱情檩帐,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布另萤,位于F島的核電站湃密,受9級(jí)特大地震影響诅挑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泛源,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一拔妥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧达箍,春花似錦没龙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赃磨,卻和暖如春筝家,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背煞躬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逸邦,地道東北人恩沛。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缕减,于是被迫代替她去往敵國(guó)和親雷客。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容