AugularJs上傳前預覽圖片

在工做中,使用AugularJs進行開發,在項目中,常常會遇到上傳圖片後,需在一旁預覽圖片內容,以前查了一些資料,結合實踐,得出一種比較實用的方法,相對簡化版,在這裏記錄一下,若有不一樣見解,歡迎一塊兒溝通,一塊兒成長。
demo.html: 
[html] view plain copy
<!doctype html>  
<html ng-app="myTestCtrl">  
<head>  
    <meta charset="UTF-8">  
    <title>demo</title>  
    <script src="http://apps.bdimg.com/libs/angular.js/1.4.6/angular.min.js"></script>  
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>  
    <script src="myCtrl.js"></script>  
    <style type="text/css">  
    .inputBox{width: 160px; height: 28px; padding: 0 0 0 8px; box-sizing: border-box;  background-color:#fff; margin-left: 5px; border: 1px solid #c4c4c4; color: #333; border-radius: 3px; -o-border-radius: 3px;-moz-border-radius: 3px;-webkit-border-radius: 3px;}  
    .inputBox:focus{border: 1px solid #207fe9;}  
    .btn-primary {color: #fff; background-color: #428bca; border-color: #357ebd;}  
    .btn {display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: 400;line-height: 1.42857143; text-align: center; white-space: nowrap; vertical-align: middle; -ms-touch-action: manipulation; touch-action: manipulation; cursor: pointer; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px;}  
    .bg-bbbbbb{background-color: #bbb;}  
  
    .fl{float:left;}  
    .ml5{margin-left: 5px;}  
    .ml10{margin-left: 10px;}  
    .ml30{margin-left: 30px;}  
    .mt10{margin-top: 10px;}  
    .mt20{margin-top: 20px;}  
  
    .f-cb:after:after{display:block;clear:both;visibility:hidden;height:0;overflow:hidden;content:".";}  
    .f-cb{zoom:1;}  
    .f-cb .topSearch{ float: left; margin-top: 10px; line-height: 30px; font-size: 12px; }  
  
    </style>  
  
</head>  
<body id="myTestCtrl" ng-controller="myTestCtrl">  
<div class="wrapper">  
    <div class="content">  
        <div class="f-cb" style="height: 40px;">  
            <div class="topSearch"><span class="w70 tr dib fl">主視覺圖:</span><input type="text" class="inputBox fl ml5" ng-model="fileName"><button class="btn btn-primary ml10" ng-class="{'bg-bbbbbb':imgDisabled}" style="width:60px; margin-top:-3px; height:18px; position: relative;" img-upload></button></div>  
        </div>  
        <div class="f-cb mt10"><img ng-src="{{thumb.imgSrc}}" style="width:200px; height: 200px;" ng-show="thumb.imgSrc"/></div>  
    </div>  
    <div class="mt20 ml30">  
        <button class="btn btn-primary" ng-click="saveClick()" ng-class="{'bg-bbbbbb':submitDisabled}">提交</button>  
    </div>  
</div>  
</body>  
</html>  
[html] view plain copy
<span style="font-size:14px;">myCtrl.js:</span>  
[html] view plain copy
<pre name="code" class="javascript">//關鍵 js 部分  
var myTestCtrl = angular.module('myTestCtrl', []);  
  
//定義「上傳」指令,修改後也可用於上傳其餘類型的文件  
myTestCtrl.directive("imgUpload",function(){  
    return{  
        //經過設置項來定義  
        restrict: 'AE',  
        scope: false,  
        template: '<div class="fl"><input type="button" id="storeBtn" style="padding:0; position: absolute; top: 0; left: 0; background: none; border: none;color: #fff; width:84px; height: 30px; line-height: 30px;" value="選擇文件"><input type="file" name="testReport" id="file" ng-disabled="imgDisabled" style="position: absolute; top: 0; left: 0; opacity: 0;height: 30px;" accept=".jpg,.png"></div>',   //name:testReport 與接口字段相對應。  
        replace: true,  
        link: function(scope, ele, attrs) {  
            ele.bind('click', function() {  
                $('#file').val('');  
            });  
            ele.bind('change', function() {  
                scope.file = ele[0].children[1].files;  
                if(scope.file[0].size > 52428800){  
                    alert("圖片大小不大於50M");  
                    scope.file = null;  
                    return false;  
                }  
                scope.fileName = scope.file[0].name;  
                var postfix = scope.fileName.substring(scope.fileName.lastIndexOf(".")+1).toLowerCase();  
                if(postfix !="jpg" && postfix !="png"){  
                    alert("圖片僅支持png、jpg類型的文件");  
                    scope.fileName = "";  
                    scope.file = null;  
                    scope.$apply();  
                    return false;  
                }  
                scope.$apply();  
  
                scope.reader = new FileReader();    //建立一個FileReader接口  
                console.log(scope.reader);  
                if (scope.file) {  
                    //獲取圖片(預覽圖片)  
                    scope.reader.readAsDataURL(scope.file[0]);    //FileReader的方法,把圖片轉成base64  
                    scope.reader.onload = function(ev) {  
                        scope.$apply(function(){  
                            scope.thumb = {  
                                imgSrc : ev.target.result       //接收base64,scope.thumb.imgSrc爲圖片。  
                            };  
                        });  
                    };  
  
                }else{  
                    alert('上傳圖片不能爲空!');  
                }  
            });  
        }  
    };  
});  
<ul class="silder_list" >
<li>
<a href="http://beijing.changtu.com/" target="_blank">北京客運站</a>
</li>
</ul>javascript

相關文章
相關標籤/搜索