如何在 AngularJS 中读取文件?

Posted

技术标签:

【中文标题】如何在 AngularJS 中读取文件?【英文标题】:How to read a file in AngularJS? 【发布时间】:2013-09-21 06:05:53 【问题描述】:

是否可以在 AngularJS 中读取文件?我想将文件放入 html5 画布中进行裁剪。

我正在考虑使用指令?这是我要放入指令中的 javascript 代码:

function readURL(input) 

    if (input.files && input.files[0]) 
        var reader = new FileReader();

        reader.onload = function (e) 
            $('#blah').attr('src', e.target.result);
        

        reader.readAsDataURL(input.files[0]);
    

【问题讨论】:

【参考方案1】:

是的,指令是正确的方法,但看起来有点不同:

.directive("ngFileSelect",function()    
  return 
    link: function($scope,el)          
      el.bind("change", function(e)          
        $scope.file = (e.srcElement || e.target).files[0];
        $scope.getFile();
      );          
            
  
)

工作示例:http://plnkr.co/edit/y5n16v?p=preview

感谢 lalalalalmbda 提供this link。

【讨论】:

是否可以在没有“更改”事件的情况下读取文件?例如,当单击编辑按钮打开引导模式并将值设置为来自先前加载的数据的输入文件时?【参考方案2】:

我采用了 Cherniv 的代码并将其全部折叠成一个指令:

.directive('fileSelect', ['$window', function ($window) 
    return 
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, el, attr, ctrl) 
            var fileReader = new $window.FileReader();

            fileReader.onload = function () 
                ctrl.$setViewValue(fileReader.result);

                if ('fileLoaded' in attr) 
                    scope.$eval(attr['fileLoaded']);
                
            ;

            fileReader.onprogress = function (event) 
                if ('fileProgress' in attr) 
                    scope.$eval(attr['fileProgress'], 
                    '$total': event.total, '$loaded': event.loaded);
                
            ;

            fileReader.onerror = function () 
                if ('fileError' in attr) 
                    scope.$eval(attr['fileError'], 
                    '$error': fileReader.error);
                
            ;

            var fileType = attr['fileSelect'];

            el.bind('change', function (e) 
                var fileName = e.target.files[0];

                if (fileType === '' || fileType === 'text') 
                    fileReader.readAsText(fileName);
                 else if (fileType === 'data') 
                    fileReader.readAsDataURL(fileName);
                
            );
        
    ;
]);

然后您可以按如下方式使用该指令:

<input type="file" ng-model="file.data" 
       file-select="data" 
       file-loaded="myLoaded()"
       file-error="myError($error)" 
       file-progress="myProgress($total,$loaded)">

“file.data”、“myLoaded”、“myError”和“myProgress”在封闭范围内。

【讨论】:

【参考方案3】:

Angular 文件阅读器。

link: function(scope, element, attrs) 
            element.on('change', function(e) 
                var reader = new FileReader();
                reader.onload = function(e) 
                    scope.$apply(function() 
                       scope.onReadFile($content:e.target.result);
                    );
                ;
                reader.readAsText((e.srcElement || e.target).files[0]);
            );
        

现场示例:Live Run On Plunker

【讨论】:

以上是关于如何在 AngularJS 中读取文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何用angularjs读取本地json

angularjs中的$ http.get读取txt文件但无法读取json文件

从AngularJS中的文件中读取JSON

从 Angularjs 中的 JSON 文件读取数据

如何从 javascript 文件中的属性文件中读取值

如何从 json 文件中读取数据,是不是有语法错误?