Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AngularJs上载文件/图像_Javascript_Jquery_Angularjs_File Upload_Angularjs Directive - Fatal编程技术网

Javascript 使用AngularJs上载文件/图像

Javascript 使用AngularJs上载文件/图像,javascript,jquery,angularjs,file-upload,angularjs-directive,Javascript,Jquery,Angularjs,File Upload,Angularjs Directive,我想用AngularJs上传一个文件(so图像)…我读到AngularJs不支持标记输入type=“file”,所以我读到我需要自定义指令…我想获取输入文件并将其用于在同一页面html上显示预览(缩略图)和在控制器中在服务器上上传文件…在我的页面html中,我编写了以下代码: <body ng-controller="myController"> <h1>Select file</h1> <input type="file" file-model="m

我想用AngularJs上传一个文件(so图像)…我读到AngularJs不支持标记输入type=“file”,所以我读到我需要自定义指令…我想获取输入文件并将其用于在同一页面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>
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
这是我的控制器:

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

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

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

在您的html中:

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
});    

}    

错误在您的指令中

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

这是一个小服务,我已经创建了处理上传


试试这个,它对我有效

从你发布的代码来看,它似乎缺少一个ng应用声明-将ng应用放在body标签上,如:我在本例中省略了,因为它被服务对不起,你能帮我处理代码吗?因为它必须运行…如果我以这种方式在directi中定位un-allert alert(文件);我获取[object File],这样我就可以获取文件,并读取名称、大小和上次修改的内容。当我传递作用域为.emit(“fileSelected”,file)的文件时;我在我的控制器中获取这个值…如果我尝试在我的html页面和控制台中显示文件,我会在控制台中获得“未定义”…为什么?谢谢对不起,你能评论一下代码吗?另外,如何将文件/imge from指令传递给控制器以显示图像预览?谢谢@user3751473我使用以下命令将文件/图像from指令传递给我的控制器函数angular.element(document.querySelector(“#fileInput”)。on('change',handleFileSelect);我的控制器var handleFileSelect=function(selectedFile){$scope.showCropSection=true;var file=selectedFile.currentTarget.files[0];var reader=new FileReader();reader.onload=function(selectedFile){$scope.$apply(function($scope){$scope.myImage=selectedFile.target.result;});};reader.readAsDataURL(文件);};
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
    <input type="file" ng-model="editItem._attachments_uri.image" 
accept="image/*" app-filereader />
 .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
});    

}