AugularJs上传图片预览

在工作中,使用AugularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,之前查了一些资料,结合实践,得出一种比较实用的方法,相对简化版,在这里记录一下,如有不同看法,欢迎一起沟通,一起成长。

demo.html: 

<!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>
效果如图所示:

关键js部分:


//关键 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('上传图片不能为空!');
                }
            });
        }
    };
});

myTestCtrl.controller("myTestCtrl", function($scope, $http) {

    //导入图片
    $scope.saveClick = function () {
        //禁用按钮
        $scope.imgDisabled = true;
        $scope.submitDisabled = true;
        var url = '';//接口路径
        var fd = new FormData();
        fd.append('testReport', $scope.file[0]);//参数  testReport=后台定义上传字段名称 ;  $scope.file[0] 内容
        $http.post(url, fd, {
            transformRequest: angular.identity,
            headers: {
                'Content-Type': undefined
            }
        }).success(function (data) {
            if(data.code != 100) {
                alert(JSON.stringify('文件导入失败:'+files.files[0].name+',请重新上传正确的文件或格式'));
            }else{
                alert(JSON.stringify('文件导入成功:'+files.files[0].name));
            }
            //恢复按钮
            $scope.imgDisabled = false;
            $scope.submitDisabled = false;
        }).error(function (data) {
            alert('服务器错误,文件导入失败!');
            //恢复按钮
            $scope.imgDisabled = false;
            $scope.submitDisabled = false;
        });
    };
});



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值