使用AngularJS上传文件


296

这是我的HTML表单:

<form name="myForm" ng-submit="">
    <input ng-model='file' type="file"/>
    <input type="submit" value='Submit'/>
</form>

我想从本地计算机上传图像,并想读取上传文件的内容。我想使用AngularJS进行的所有操作。

当我尝试打印时,$scope.file它的值是未定义的。



Answers:


344

这里的一些答案建议使用FormData(),但是很遗憾,这是Internet Explorer 9及更低版本中不提供的浏览器对象。如果需要支持那些较旧的浏览器,则需要使用<iframe>或Flash 等备份策略。

已经有许多Angular.js模块可以执行文件上传。这两个对旧版浏览器有明确的支持:

还有其他一些选择:

其中之一应适合您的项目,或者可以使您对如何自己编写代码有所了解。



27
EggHead对此有一个很好的视频-egghead.io/lessons/angularjs-file-uploads
Adam

2
danialfarid / angular-file-upload重命名为ng-file-upload
Michael

5
3岁的答案。IE 9现已于2016
失效。– user2404597 '16

5
我认为您应该更新答案以找到适当的解决方案,而不要指向链接。这就是堆栈溢出的方式。否则,只需将其作为注释即可。
亚历克斯·雷诺兹

178

最简单的是使用HTML5 API,即 FileReader

HTML非常简单:

<input type="file" id="file" name="file"/>
<button ng-click="add()">Add</button>

在您的控制器中定义“添加”方法:

$scope.add = function() {
    var f = document.getElementById('file').files[0],
        r = new FileReader();

    r.onloadend = function(e) {
      var data = e.target.result;
      //send your binary data via $http or $resource or do anything else with it
    }

    r.readAsBinaryString(f);
}

浏览器兼容性

桌面浏览器

Edge 12,Firefox(Gecko)3.6(1.9.2),Chrome 7,Opera * 12.02,Safari 6.0.2

移动浏览器

Firefox(壁虎)32,Chrome 3,Opera * 11.5,Safari 6.1

注意:不建议使用readAsBinaryString()方法,而应使用readAsArrayBuffer()


10
FileReader是标准HTML5 File API w3.org/TR/FileAPI中的类。它允许您从html输入元素中指定的文件中读取数据,并在onloadend回调函数中对其进行处理。您不需要任何库即可使用此API,它已经在您的浏览器中(除非您使用的是非常老的库)。希望这可以帮助。
yagger

15
自2012年7月12日起,W3C已弃用FileReader.readAsBinaryString
Shane Stillwell 2014年

13
您不应该使用angular访问DOM。是非常不好的做法。
jeanmatthieud

9
@Siderex,不在控制器中,但是从指令执行它是非常好的。实际上,这就是指令的目的。您可以在Angular docs docs.angularjs.org/guide/directive
yagger 2015年

1
@yagger是否有特定的原因,为什么您的链接引用FileReaderSync的readAsArrayBuffer方法(仅在Web worker中可用)而不是常规的异步FileReader API
doldt 2015年

58

这是现代的浏览器方式,没有第三方库。适用于所有最新的浏览器。

 app.directive('myDirective', function (httpPostFactory) {
    return {
        restrict: 'A',
        scope: true,
        link: function (scope, element, attr) {

            element.bind('change', function () {
                var formData = new FormData();
                formData.append('file', element[0].files[0]);
                httpPostFactory('upload_image.php', formData, function (callback) {
                   // recieve image name to use in a ng-src 
                    console.log(callback);
                });
            });

        }
    };
});

app.factory('httpPostFactory', function ($http) {
    return function (file, data, callback) {
        $http({
            url: file,
            method: "POST",
            data: data,
            headers: {'Content-Type': undefined}
        }).success(function (response) {
            callback(response);
        });
    };
});

HTML:

<input data-my-Directive type="file" name="file">

PHP:

if (isset($_FILES['file']) && $_FILES['file']['error'] == 0) {

// uploads image in the folder images
    $temp = explode(".", $_FILES["file"]["name"]);
    $newfilename = substr(md5(time()), 0, 10) . '.' . end($temp);
    move_uploaded_file($_FILES['file']['tmp_name'], 'images/' . $newfilename);

// give callback to your angular code with the image src name
    echo json_encode($newfilename);
}

js小提琴(仅前端) https://jsfiddle.net/vince123/8d18tsey/31/


您将如何在节点中获取文件?
多汁

还有更多细节吗?您需要一个ng-submit动作还是一个表单动作?这本身无能为力
Aron

@Emaborsa你好,我添加了一个jsfiddle并制作了一个更完整的php代码示例。它在文件输入值更改后提交图像,因此不需要ng-submit。
文斯·弗洛文

完美,最简单的解决方案,但是我花了很长时间才弄清楚如何获取WCF服务来处理正在上传的数据。这是至关重要的,你把数据流,并使之通过类似MultiParser实际上在文件的数据读取: stackoverflow.com/a/23702692/391605 否则你会被存储“------ WebKitFormBoundary原始字节内容处置:...等等。”
Mike Gledhill,2016年

我需要在$ http请求对象中添加属性'transformRequest:angular.identity',如Manoy Ojha所显示的那样,否则将无法正确设置Content-Type并且该示例将无法正常工作。
Gregor Slavec

38

以下是文件上传的工作示例:

http://jsfiddle.net/vishalvasani/4hqVu/

在这个函数中,

setFiles

从视图将更新控制器中的文件数组

要么

您可以使用AngularJS检查jQuery文件上传

http://blueimp.github.io/jQuery-File-Upload/angularjs.html


嗨,我一直在寻找可以上传一个文件并显示在文件下方的内容。但是,在您的示例中,我无法执行此操作。别介意,但是我对这个angularjs并不陌生,我打算学习以更简单但更可靠的方式实现此特定目标。
Aditya Sethi

这很有帮助。谢谢!
RachelD

无需使用其他库/扩展程序的优秀示例。谢谢。
markdsievers 2014年

4
非常有用,请注意。.它使用File API,该API在IE9或更低版本中不起作用。
ArjaaAine 2014年

知道我如何从结果中获取错误吗?服务器可能会引发错误,我想显示该错误消息...
CularBytes


14

使用该onchange事件将输入文件元素传递给函数。

<input type="file" onchange="angular.element(this).scope().fileSelected(this)" />

因此,当用户选择文件时,您无需单击“添加”或“上传”按钮就可以对其进行引用。

$scope.fileSelected = function (element) {
    var myFileSelected = element.files[0];
};

2
这无法正常工作。这是我的工作流程:1.刷新页面2.添加新文件。**添加的第一个文件始终是未定义的。** 3.添加另一个文件。从现在开始,每个上传的文件都是我之前添加的文件。因此,对于我添加的第二个文件,这将上传我添加的第一个文件(实际上失败了)
Pulkit Pahwa

1
最好的方法!
斯蒂芬·雅科文科

11

我尝试了@Anoyz(正确答案)给出的所有替代方法...最佳解决方案是https://github.com/danialfarid/angular-file-upload

一些功能:

  • 进展
  • 多文件
  • 领域
  • 旧版浏览器(IE8-9)

对我来说很好。您只需要注意说明即可。

在服务器端,我使用NodeJ,Express 4和Multer中间件来管理多部分请求。


您如何显示图像?从后端开始,它们可以成功进入,但是它们将另存为,nlzt9LJWRrAZEO3ZteZUOgGc但是没有.png格式。如何添加呢?
Saras Arya

9

的HTML

<html>
    <head></head>

<body ng-app = "myApp">

  <form ng-controller = "myCtrl">
     <input type = "file" file-model="files" multiple/>
     <button ng-click = "uploadFile()">upload me</button>
     <li ng-repeat="file in files">{{file.name}}</li>
  </form>

剧本

  <script src = 
     "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
  <script>
    angular.module('myApp', []).directive('fileModel', ['$parse', function ($parse) {
        return {
           restrict: 'A',
           link: function(scope, element, attrs) {
              element.bind('change', function(){
              $parse(attrs.fileModel).assign(scope,element[0].files)
                 scope.$apply();
              });
           }
        };
     }]).controller('myCtrl', ['$scope', '$http', function($scope, $http){


       $scope.uploadFile=function(){
       var fd=new FormData();
        console.log($scope.files);
        angular.forEach($scope.files,function(file){
        fd.append('file',file);
        });
       $http.post('http://localhost:1337/mediaobject/upload',fd,
           {
               transformRequest: angular.identity,
               headers: {'Content-Type': undefined}                     
            }).success(function(d)
                {
                    console.log(d);
                })         
       }
     }]);

  </script>


9

<input type=file>默认情况下,该元素不适用于ng-model指令。它需要一个自定义指令

select-ng-files适用于1的指令的工作演示ng-model

angular.module("app",[]);

angular.module("app").directive("selectNgFiles", function() {
  return {
    require: "ngModel",
    link: function postLink(scope,elem,attrs,ngModel) {
      elem.on("change", function(e) {
        var files = elem[0].files;
        ngModel.$setViewValue(files);
      })
    }
  }
});
<script src="//unpkg.com/angular/angular.js"></script>
  <body ng-app="app">
    <h1>AngularJS Input `type=file` Demo</h1>
    
    <input type="file" select-ng-files ng-model="fileList" multiple>
    
    <h2>Files</h2>
    <div ng-repeat="file in fileList">
      {{file.name}}
    </div>
  </body>


$http.post文件列表

$scope.upload = function(url, fileList) {
    var config = { headers: { 'Content-Type': undefined },
                   transformResponse: angular.identity
                 };
    var promises = fileList.map(function(file) {
        return $http.post(url, file, config);
    });
    return $q.all(promises);
};

发送带有File对象的POST时,进行设置很重要'Content-Type': undefined。然后,XHR send方法将检测File对象并自动设置内容类型。


7

指令简单

HTML:

<input type="file" file-upload multiple/>

JS:

app.directive('fileUpload', function () {
return {
    scope: true,        //create a new scope
    link: function (scope, el, attrs) {
        el.bind('change', function (event) {
            var files = event.target.files;
            //iterate files since 'multiple' may be specified on the element
            for (var i = 0;i<files.length;i++) {
                //emit event upward
                scope.$emit("fileSelected", { file: files[i] });
            }                                       
        });
    }
};

在指令中,我们确保创建了新的作用域,然后侦听对文件输入元素所做的更改。当检测到更改时,以文件对象为参数,向所有祖先作用域(向上)发出事件。

在您的控制器中:

$scope.files = [];

//listen for the file selected event
$scope.$on("fileSelected", function (event, args) {
    $scope.$apply(function () {            
        //add the file object to the scope's files collection
        $scope.files.push(args.file);
    });
});

然后在您的ajax调用中:

data: { model: $scope.model, files: $scope.files }

http://shazwazza.com/post/uploading-files-and-json-data-in-the-same-request-with-angular-js/


7

我认为这是角度文件上传:

ng-file-upload

轻型Angular JS指令可上传文件。

这是DEMO页面。

  • 支持上传进度,进行中的取消/中止上传,文件拖放(html5),目录拖放(webkit),CORS,PUT(html5)/ POST方法,文件类型和大小的验证,显示所选图像的预览/音频/视频。
  • 使用Flash polyfill FileAPI跨浏览器上传文件和FileReader(HTML5和非HTML5)。在上传文件之前允许客户端验证/修改
  • 使用Upload.http()使用文件的内容类型直接上传到db服务CouchDB,imgur等。这将为有角度的http POST / PUT请求启用进度事件。
  • 独立的shim文件,FileAPI文件按需加载非HTML5代码,这意味着如果您只需要HTML5支持,则无需额外的加载/代码。
  • 使用常规$ http进行轻量级上传(对于非HTML5浏览器使用shim进行上载),因此所有有角度的$ http功能均可用

https://github.com/danialfarid/ng-file-upload


6

您的文件和json数据同时上传。

// FIRST SOLUTION
 var _post = function (file, jsonData) {
            $http({
                url: your url,
                method: "POST",
                headers: { 'Content-Type': undefined },
                transformRequest: function (data) {
                    var formData = new FormData();
                    formData.append("model", angular.toJson(data.model));
                    formData.append("file", data.files);
                    return formData;
                },
                data: { model: jsonData, files: file }
            }).then(function (response) {
                ;
            });
        }
// END OF FIRST SOLUTION

// SECOND SOLUTION
// If you can add plural file and  If above code give an error.
// You can try following code
 var _post = function (file, jsonData) {
            $http({
                url: your url,
                method: "POST",
                headers: { 'Content-Type': undefined },
                transformRequest: function (data) {
                    var formData = new FormData();
                    formData.append("model", angular.toJson(data.model));
                for (var i = 0; i < data.files.length; i++) {
                    // add each file to
                    // the form data and iteratively name them
                    formData.append("file" + i, data.files[i]);
                }
                    return formData;
                },
                data: { model: jsonData, files: file }
            }).then(function (response) {
                ;
            });
        }
// END OF SECOND SOLUTION


4

您可以使用FormData安全快速的对象:

// Store the file object when input field is changed
$scope.contentChanged = function(event){
    if (!event.files.length)
        return null;

    $scope.content = new FormData();
    $scope.content.append('fileUpload', event.files[0]); 
    $scope.$apply();
}

// Upload the file over HTTP
$scope.upload = function(){
    $http({
        method: 'POST', 
        url: '/remote/url',
        headers: {'Content-Type': undefined },
        data: $scope.content,
    }).success(function(response) {
        // Uploading complete
        console.log('Request finished', response);
    });
}

您能否也说明“ contentChanged”的确切使用位置?
Marc J. Schmidt

当文件输入更改时,触发此功能将开始上传过程。
Farsheed '16

1
既然没有<input type="file" ng-change="contentChanged($event)">,该怎么办?
Marc J. Schmidt

3

http://jsfiddle.net/vishalvasani/4hqVu/在chrome和IE中效果很好(如果您在背景图片中稍微更新了CSS)。这用于更新进度条:

 scope.progress = Math.round(evt.loaded * 100 / evt.total)

但是在FireFox中,虽然文件上传成功,但是在DOM中无法成功更新angular的[percent]数据。


对于FF,您可以侦听load事件,如果长度是可计算的,则触发进度事件以指示成功上传。github.com/danialfarid/angular-file-upload已经解决了这一问题。
danial 2014年

它在那里,但是在给定的小提琴中也对其进行了检查和应用。FF仍然没有希望。
mayankcpdixit 2014年

我认为,如果您仅在uploadComplete内部调用uploadProgress,则它应适用于FF
danial

不,不是,即使可以,请解释原因?我在文章中提供了一个小提琴的链接。如果可能的话,您能否将其更新为可在FF中使用,并在此处评论解决方案的链接?
mayankcpdixit 2014年

什么版本的Firefox?
danial 2014年

3

您可以考虑将IaaS用于文件上传,例如Uploadcare。有一个Angular软件包:https : //github.com/uploadcare/angular-uploadcare

从技术上讲,它是作为指令实施的,提供了不同的上载选项以及对小部件中上载的图像的操作:

<uploadcare-widget
  ng-model="object.image.info.uuid"
  data-public-key="YOURKEYHERE"
  data-locale="en"
  data-tabs="file url"
  data-images-only="true"
  data-path-value="true"
  data-preview-step="true"
  data-clearable="true"
  data-multiple="false"
  data-crop="400:200"
  on-upload-complete="onUCUploadComplete(info)"
  on-widget-ready="onUCWidgetReady(widget)"
  value="{{ object.image.info.cdnUrl }}"
 />

要使用的更多配置选项:https : //uploadcare.com/widget/configure/


3

我知道这是一个较晚的条目,但是我创建了一个简单的上载指令。您可以立即开始工作!

<input type="file" multiple ng-simple-upload web-api-url="/api/Upload" callback-fn="myCallback" />

ng-simple-upload在Github 上提供更多示例,并提供使用Web API的示例。


3

的HTML

<input type="file" id="file" name='file' onchange="angular.element(this).scope().profileimage(this)" />

向您的控制器添加'profileimage()'方法

    $scope.profileimage = function(selectimage) {
      console.log(selectimage.files[0]);
 var selectfile=selectimage.files[0];
        r = new FileReader();
        r.onloadend = function (e) {
            debugger;
            var data = e.target.result;

        }
        r.readAsBinaryString(selectfile);
    }

2

这应该是对@ jquery-guru答案的更新/评论,但由于我没有足够的代表,它会放在这里。它修复了代码现在生成的错误。

https://jsfiddle.net/vzhrqotw/

更改基本上是:

FileUploadCtrl.$inject = ['$scope']
function FileUploadCtrl(scope) {

至:

app.controller('FileUploadCtrl', function($scope)
{

如果需要,可以随意移动到更合适的位置。


2

我已经阅读了所有线程,并且HTML5 API解决方案看起来最好。但这会更改我的二进制文件,并以我未调查的方式破坏它们。最适合我的解决方案是:

HTML:

<input type="file" id="msds" ng-model="msds" name="msds"/>
<button ng-click="msds_update()">
    Upload
</button>

JS:

msds_update = function() {
    var f = document.getElementById('msds').files[0],
        r = new FileReader();
    r.onloadend = function(e) {
        var data = e.target.result;
        console.log(data);
        var fd = new FormData();
        fd.append('file', data);
        fd.append('file_name', f.name);
        $http.post('server_handler.php', fd, {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        })
        .success(function(){
            console.log('success');
        })
        .error(function(){
            console.log('error');
        });
    };
    r.readAsDataURL(f);
}

服务器端(PHP):

$file_content = $_POST['file'];
$file_content = substr($file_content,
    strlen('data:text/plain;base64,'));
$file_content = base64_decode($file_content);

1

我可以使用以下代码使用AngularJS上传文件:

file为需要传递的函数的参数ngUploadFileUpload$scope.file按你的问题。

这里的重点是使用transformRequest: []。这样可以防止$ http弄乱文件的内容。

       function getFileBuffer(file) {
            var deferred = new $q.defer();
            var reader = new FileReader();
            reader.onloadend = function (e) {
                deferred.resolve(e.target.result);
            }
            reader.onerror = function (e) {
                deferred.reject(e.target.error);
            }

            reader.readAsArrayBuffer(file);
            return deferred.promise;
        }

        function ngUploadFileUpload(endPointUrl, file) {

            var deferred = new $q.defer();
            getFileBuffer(file).then(function (arrayBuffer) {

                $http({
                    method: 'POST',
                    url: endPointUrl,
                    headers: {
                        "accept": "application/json;odata=verbose",
                        'X-RequestDigest': spContext.securityValidation,
                        "content-length": arrayBuffer.byteLength
                    },
                    data: arrayBuffer,
                    transformRequest: []
                }).then(function (data) {
                    deferred.resolve(data);
                }, function (error) {
                    deferred.reject(error);
                    console.error("Error", error)
                });
            }, function (error) {
                console.error("Error", error)
            });

            return deferred.promise;

        }

0

以上接受的答案与浏览器不兼容。如果有人遇到兼容性问题,请尝试此操作。

小提琴

查看代码

 <div ng-controller="MyCtrl">
      <input type="file" id="file" name="file"/>
      <br>
      <button ng-click="add()">Add</button>
      <p>{{data}}</p>
    </div>

控制器代码

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

function MyCtrl($scope) {
    $scope.data = 'none';    
    $scope.add = function(){
      var f = document.getElementById('file').files[0],
          r = new FileReader();
      r.onloadend = function(e){        
          var binary = "";
var bytes = new Uint8Array(e.target.result);
var length = bytes.byteLength;

for (var i = 0; i < length; i++) 
{
    binary += String.fromCharCode(bytes[i]);
}

$scope.data = (binary).toString();

          alert($scope.data);
      }
      r.readAsArrayBuffer(f);
    }
}

0

简单来说

在HTML中- 仅添加以下代码

     <form name="upload" class="form" data-ng-submit="addFile()">
  <input type="file" name="file" multiple 
 onchange="angular.element(this).scope().uploadedFile(this)" />
 <button type="submit">Upload </button>
</form>

在控制器中 -单击 “上传文件按钮”时将调用此功能。它将上传文件。您可以进行控制台。

$scope.uploadedFile = function(element) {
$scope.$apply(function($scope) {
  $scope.files = element.files;         
});
}

在控制器中添加更多 -下面的代码添加到函数中。当您单击用于 “点击api(POST)”的按钮时,将调用此函数 。它将发送文件(上传的文件)和表单数据到后端。

var url = httpURL + "/reporttojson"
        var files=$scope.files;

         for ( var i = 0; i < files.length; i++)
         {
            var fd = new FormData();
             angular.forEach(files,function(file){
             fd.append('file',file);
             });
             var data ={
              msg : message,
              sub : sub,
              sendMail: sendMail,
              selectUsersAcknowledge:false
             };

             fd.append("data", JSON.stringify(data));
              $http.post(url, fd, {
               withCredentials : false,
               headers : {
                'Content-Type' : undefined
               },
             transformRequest : angular.identity
             }).success(function(data)
             {
                  toastr.success("Notification sent successfully","",{timeOut: 2000});
                  $scope.removereport()
                   $timeout(function() {
                    location.reload();
                }, 1000);

             }).error(function(data)
             {
              toastr.success("Error in Sending Notification","",{timeOut: 2000});
              $scope.removereport()
             });
        }

在这种情况下..我添加了以下代码作为表单数据

var data ={
          msg : message,
          sub : sub,
          sendMail: sendMail,
          selectUsersAcknowledge:false
         };

0
<form id="csv_file_form" ng-submit="submit_import_csv()" method="POST" enctype="multipart/form-data">
    <input ng-model='file' type="file"/>
    <input type="submit" value='Submit'/>
</form>

在angularJS控制器中

$scope.submit_import_csv = function(){

        var formData = new FormData(document.getElementById("csv_file_form"));
        console.log(formData);

        $.ajax({
            url: "import",
            type: 'POST',
            data:  formData,
            mimeType:"multipart/form-data",
            contentType: false,
            cache: false,
            processData:false,
            success: function(result, textStatus, jqXHR)
            {
            console.log(result);
            }
        });

        return false;
    }

0

我们使用了HTML,CSS和AngularJS。以下示例显示了如何使用AngularJS上传文件。

<html>

   <head>
      <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
   </head>

   <body ng-app = "myApp">

      <div ng-controller = "myCtrl">
         <input type = "file" file-model = "myFile"/>
         <button ng-click = "uploadFile()">upload me</button>
      </div>

      <script>
         var myApp = angular.module('myApp', []);

         myApp.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]);
                     });
                  });
               }
            };
         }]);

         myApp.service('fileUpload', ['$http', function ($http) {
            this.uploadFileToUrl = function(file, uploadUrl){
               var fd = new FormData();
               fd.append('file', file);

               $http.post(uploadUrl, fd, {
                  transformRequest: angular.identity,
                  headers: {'Content-Type': undefined}
               })

               .success(function(){
               })

               .error(function(){
               });
            }
         }]);

         myApp.controller('myCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){
            $scope.uploadFile = function(){
               var file = $scope.myFile;

               console.log('file is ' );
               console.dir(file);

               var uploadUrl = "/fileUpload";
               fileUpload.uploadFileToUrl(file, uploadUrl);
            };
         }]);

      </script>

   </body>
</html>

这来自TutorialsPoint,但是至少您在纠正他们的示例方面做得很好,由于明显的错误,该示例甚至无法运行!
贝尼托

0

使用简单指令(ng-file-model)的工作示例

.directive("ngFileModel", [function () {
  return {
      $scope: {
          ngFileModel: "="
      },
      link: function ($scope:any, element, attributes) {
          element.bind("change", function (changeEvent:any) {
              var reader = new FileReader();
              reader.onload = function (loadEvent) {
                  $scope.$apply(function () {
                      $scope.ngFileModel = {
                          lastModified: changeEvent.target.files[0].lastModified,
                          lastModifiedDate: changeEvent.target.files[0].lastModifiedDate,
                          name: changeEvent.target.files[0].name,
                          size: changeEvent.target.files[0].size,
                          type: changeEvent.target.files[0].type,
                          data: changeEvent.target.files[0]
                      };
                  });
              }
              reader.readAsDataURL(changeEvent.target.files[0]);
          });
      }
  }
}])

并用于FormData上传功能中的文件。

var formData = new FormData();
 formData.append("document", $scope.ngFileModel.data)
 formData.append("user_id", $scope.userId)

所有的积分都用于 https://github.com/mistralworks/ng-file-model

我面临一个小的问题,您可以在这里检查:https : //github.com/mistralworks/ng-file-model/issues/7

最后,这是一个分叉的仓库:https : //github.com/okasha93/ng-file-model/blob/patch-1/ng-file-model.js


0

该代码将有助于插入文件

<body ng-app = "myApp">
<form ng-controller="insert_Ctrl"  method="post" action=""  name="myForm" enctype="multipart/form-data" novalidate>
    <div>
        <p><input type="file" ng-model="myFile" class="form-control"  onchange="angular.element(this).scope().uploadedFile(this)">
            <span style="color:red" ng-show="(myForm.myFile.$error.required&&myForm.myFile.$touched)">Select Picture</span>
        </p>
    </div>
    <div>
        <input type="button" name="submit"  ng-click="uploadFile()" class="btn-primary" ng-disabled="myForm.myFile.$invalid" value="insert">
    </div>
</form>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
<script src="insert.js"></script>
</body>

insert.js

var app = angular.module('myApp',[]);
app.service('uploadFile', ['$http','$window', function ($http,$window) {
    this.uploadFiletoServer = function(file,uploadUrl){
        var fd = new FormData();
        fd.append('file', file);
        $http.post(uploadUrl, fd, {
            transformRequest: angular.identity,
            headers: {'Content-Type': undefined}
        })
        .success(function(data){
            alert("insert successfull");
            $window.location.href = ' ';//your window location
        })
        .error(function(){
            alert("Error");
        });
    }
}]);
app.controller('insert_Ctrl',  ['$scope', 'uploadFile', function($scope, uploadFile){
    $scope.uploadFile = function() {
        $scope.myFile = $scope.files[0];
        var file = $scope.myFile;
        var url = "save_data.php";
        uploadFile.uploadFiletoServer(file,url);
    };
    $scope.uploadedFile = function(element) {
        var reader = new FileReader();
        reader.onload = function(event) {
            $scope.$apply(function($scope) {
                $scope.files = element.files;
                $scope.src = event.target.result  
            });
        }
        reader.readAsDataURL(element.files[0]);
    }
}]);

save_data.php

<?php
    require "dbconnection.php";
    $ext = pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION);
    $image = time().'.'.$ext;
    move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$image);
    $query="insert into test_table values ('null','$image')";
    mysqli_query($con,$query);
?>

0

这有效

file.html

<html>
   <head>
      <script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
   </head>
   <body ng-app = "app">
      <div ng-controller = "myCtrl">
         <input type = "file" file-model = "myFile"/>
         <button ng-click = "uploadFile()">upload me</button>
      </div>
   </body>
   <script src="controller.js"></script>
</html>

controller.js

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

     app.service('fileUpload', ['$http', function ($http) {
        this.uploadFileToUrl = function(file, uploadUrl){
           var fd = new FormData();
           fd.append('file', file);

           $http.post(uploadUrl, fd, {
              transformRequest: angular.identity,
              headers: {'Content-Type': undefined}
           }).success(function(res){
                console.log(res);
           }).error(function(error){
                console.log(error);
           });
        }
     }]);

     app.controller('fileCtrl', ['$scope', 'fileUpload', function($scope, fileUpload){
        $scope.uploadFile = function(){
           var file = $scope.myFile;

           console.log('file is ' );
           console.dir(file);

           var uploadUrl = "/fileUpload.php";  // upload url stands for api endpoint to handle upload to directory
           fileUpload.uploadFileToUrl(file, uploadUrl);
        };
     }]);

  </script>

fileupload.php

  <?php
    $ext = pathinfo($_FILES['file']['name'],PATHINFO_EXTENSION);
    $image = time().'.'.$ext;
    move_uploaded_file($_FILES["file"]["tmp_name"],__DIR__. ' \\'.$image);
  ?>

0

上传文件

<input type="file" name="resume" onchange="angular.element(this).scope().uploadResume()" ng-model="fileupload" id="resume" />


        $scope.uploadResume = function () { 
            var f = document.getElementById('resume').files[0];
            $scope.selectedResumeName = f.name;
            $scope.selectedResumeType = f.type;
            r = new FileReader();

            r.onloadend = function (e) { 
                $scope.data = e.target.result;
            }

            r.readAsDataURL(f);

        };

下载文件:

          <a href="{{applicant.resume}}" download> download resume</a>

var app = angular.module("myApp", []);

            app.config(['$compileProvider', function ($compileProvider) {
                $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);
                $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension):/);

            }]);

-1
app.directive('ngUpload', function () {   
  return {    
    restrict: 'A',  
    link: function (scope, element, attrs) {

      var options = {};
      options.enableControls = attrs['uploadOptionsEnableControls'];

      // get scope function to execute on successful form upload
      if (attrs['ngUpload']) {

        element.attr("target", "upload_iframe");
        element.attr("method", "post");

        // Append a timestamp field to the url to prevent browser caching results
        element.attr("action", element.attr("action") + "?_t=" + new Date().getTime());

        element.attr("enctype", "multipart/form-data");
        element.attr("encoding", "multipart/form-data");

        // Retrieve the callback function
        var fn = attrs['ngUpload'].split('(')[0];
        var callbackFn = scope.$eval(fn);
        if (callbackFn == null || callbackFn == undefined || !angular.isFunction(callbackFn))
        {
          var message = "The expression on the ngUpload directive does not point to a valid function.";
          // console.error(message);
          throw message + "\n";
        }                      

        // Helper function to create new  i frame for each form submission
        var addNewDisposableIframe = function (submitControl) {
          // create a new iframe
          var iframe = $("<iframe id='upload_iframe' name='upload_iframe' border='0' width='0' height='0' style='width: 0px; height: 0px;
border: none; display: none' />");

          // attach function to load event of the iframe
          iframe.bind('load', function () {

              // get content - requires jQuery
              var content = iframe.contents().find('body').text();

              // execute the upload response function in the active scope
              scope.$apply(function () { callbackFn(content, content !== "" /* upload completed */); });

              // remove iframe
              if (content != "") // Fixes a bug in Google Chrome that dispose the iframe before content is ready.
                setTimeout(function () { iframe.remove(); }, 250);


              submitControl.attr('disabled', null);
              submitControl.attr('title', 'Click to start upload.');
            });

          // add the new iframe to application
          element.parent().append(iframe);
        };

        // 1) get the upload submit control(s) on the form (submitters must be decorated with the 'ng-upload-submit' class)
        // 2) attach a handler to the controls' click event
        $('.upload-submit', element).click(
          function () {

            addNewDisposableIframe($(this) /* pass the submit control */);

            scope.$apply(function () { callbackFn("Please wait...", false /* upload not completed */); });



            var enabled = true;
            if (options.enableControls === null || options.enableControls === undefined || options.enableControls.length >= 0) {
              // disable the submit control on click
              $(this).attr('disabled', 'disabled');
              enabled = false;
            }

            $(this).attr('title', (enabled ? '[ENABLED]: ' : '[DISABLED]: ') + 'Uploading, please wait...');

            // submit the form
            $(element).submit();
          }
        ).attr('title', 'Click to start upload.');
      }
      else
        alert("No callback function found on the ngUpload directive.");     
    }   
  }; 
});



<form class="form form-inline" name="uploadForm" id="uploadForm"
ng-upload="uploadForm12"  action="rest/uploadHelpFile"  method="post"
enctype="multipart/form-data" style="margin-top: 3px;margin-left:
6px"> <button type="submit" id="mbUploadBtn" class="upload-submit"
ng-hide="true"></button> </form>

@RequestMapping(value = "/uploadHelpFile", method =
RequestMethod.POST)   public @ResponseBody String
uploadHelpFile(@RequestParam(value = "file") CommonsMultipartFile[]
file,@RequestParam(value = "fileName") String
fileName,@RequestParam(value = "helpFileType") String
helpFileType,@RequestParam(value = "helpFileName") String
helpFileName) { }

请格式化您的答案,格式不正确
Saineshwar '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.