使用AngularJs上传文件/图像

时间:2015-04-22 09:45:39

标签: javascript jquery angularjs file-upload angularjs-directive

我想用AngularJs上传一个文件(如此图像)...我读过AngularJs不支持标签输入类型="文件"所以我读到我需要自定义指令...我想获取输入文件并将其用于同一页面上的节目预览(缩略图)和控制器上传服务器上的文件...在我的页面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 :(得分:1)

错误在您的指令

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

 .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 :(得分:0)

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

<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 />