首页 文章

使用AngularJs上传文件/图像

提问于
浏览
2

我想用AngularJs上传一个文件(所以图像)...我读了AngularJs不支持标签输入类型=“文件”所以我读到我需要自定义指令...我想获取输入文件并使用它对于同一页面上的节目预览(缩略图)html和控制器上传服务器上的文件...在我的页面html中我写了这段代码:

<body ng-controller="myController">

<h1>Select file</h1>
<input type="file" file-model="myFile" />
<div>
     <h2>File content is:</h2>
     <pre>{{ content }}</pre>
</div>

</body>

我写了这个指令:

var modulo = angular.module('myApp', []);


modulo.directive('fileModel', function () {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
            element.on('change', function (event) {
                var file = event.target.files[0];
                scope.$emit("fileSelected", file);
            });            
        }
    };
});

这是我的控制器:

modulo.controller('myController', function ($scope) {

    $scope.$on('fileSelected', function (event, args) {
        $scope.content(args.file);
        console.log(args.file);
    });
});

这段代码不起作用......有解决方案吗?错误在哪里?

2 回答

  • 0

    错误在您的指令中

    检查一下,我在我的应用程序中使用了相同的指令

    .directive('fileModel', ['$parse', function ($parse) {
      return {
      restrict: 'A',
      link: function(scope, element, attrs) {
        var model = $parse(attrs.fileModel);
        var modelSetter = model.assign;
    
        element.bind('change', function(){
          scope.$apply(function(){
            modelSetter(scope, element[0].files[0]);
          });
        });
      }
    };
    }
    this is my html to 
    input(type="file", file-model="myFile", accept="image/*", image="image", id='fileInput')
    

    这是我创建的一个小服务来处理上传

    function fileUpload (file, uploadUrl) { 
    
    var cropedImage = dataURItoBlob(file);
    var fileData = new FormData(),
        uploadedImage = '';
    fileData.append('fileUpload', cropedImage);
    
    return $http({
      withCredentials: true,
      method: "POST",
      url: uploadUrl,      
      data: fileData,
      headers: {'Content-Type': undefined},
      transformRequest: angular.identity
    });    
    
    }
    

    试试这个,它对我有用

  • 1

    您应该执行以下操作来显示图像:

    <pre><img data-ng-src="data:image/png;base64,{{ content }}"/></pre>
    

    要从输入中检索数据,您应该使用自定义指令,如this answer中所示:

    angular.module('appFilereader', []).directive('appFilereader', function($q)   
    {
        var slice = Array.prototype.slice;
        return {
           restrict: 'A',
           require: '?ngModel',
           link: function(scope, element, attrs, ngModel) {
                if (!ngModel) return;
    
                ngModel.$render = function() {};
    
                element.bind('change', function(e) {
                    var element = e.target;
    
                    $q.all(slice.call(element.files, 0).map(readFile))
                        .then(function(values) {
                            if (element.multiple) ngModel.$setViewValue(values);
                            else ngModel.$setViewValue(values.length ? values[0] : null);
                        });
    
                    function readFile(file) {
                        var deferred = $q.defer();
    
                        var reader = new FileReader();
                        reader.onload = function(e) {
                            deferred.resolve(e.target.result);
                        };
                        reader.onerror = function(e) {
                            deferred.reject(e);
                        };
                        reader.readAsDataURL(file);
    
                        return deferred.promise;
         }
    
     ); //change
    

    在你的HTML中:

    <input type="file" ng-model="editItem._attachments_uri.image" 
    accept="image/*" app-filereader />
    

相关问题