Bestand uploaden met behulp van Angularjs

Hier is mijn HTML-formulier:

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

Ik wil een afbeelding van de lokale machine uploaden en de inhoud van het geüploade bestand willen lezen. Dit alles wil ik doen met behulp van Angularjs.

Wanneer ik probeer de waarde van $scope.filete drukken, wordt deze niet gedefinieerd.


1, Autoriteit 100%

Enkele antwoorden hier voorstellen met FormData(), maar helaas is dat een browserobject niet beschikbaar in Internet Explorer 9 en lager. Als u die oudere browsers moet ondersteunen, heeft u een back-upstrategie nodig, zoals het gebruik van <iframe>of Flash.

Er zijn al veel angular.js-modules om het uploaden van bestanden uit te voeren. Deze twee hebben expliciete steun voor oudere browsers:

En enkele andere opties:

Een van deze moet passen bij uw project, of kan u wat inzicht geven in hoe u het zelf codeert.


Antwoord 2, autoriteit 52%

Het gemakkelijkste is om HTML5 API te gebruiken, namelijk FileReader

HTML is vrij eenvoudig:

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

Definieer in je controller de ‘add’-methode:

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

Browsercompatibiliteit

Desktopbrowsers

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

Mobiele browsers

Firefox(Gekko) 32,
chroom 3,
Opera* 11.5,
Safari 6.1

Opmerking: de methode readAsBinaryString() is verouderd en readAsArrayBuffer()moet in plaats daarvan worden gebruikt.


Antwoord 3, autoriteit 17%

Dit is de moderne manier van browsers, zonder bibliotheken van derden. Werkt op de nieuwste browsers.

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 fiddle (only front-end)
https://jsfiddle.net/vince123/8d15Tey/31/


4, Autoriteit 11%

Hieronder is werkvoorbeeld van bestand uploaden:

http://jsfiddle.net/vissalvasani/4hqvu/

In deze functie genaamd

setFiles

Vanuit View die de bestandsarray in controller zal updaten

of

U kunt jQuery-bestandsupload controleren met AngularJS

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


Antwoord 5, autoriteit 5%

Je kunt mooie bestanden en mappen uploaden met flow.js.

https://github.com/flowjs/ng-flow

Bekijk hier een demo

http://flowjs.github.io/ng-flow/

Het ondersteunt geen IE7, IE8, IE9, dus je zult uiteindelijk een compatibiliteitslaag moeten gebruiken

https://github.com/flowjs/fusty-flow.js


Antwoord 6, autoriteit 4%

Gebruik de gebeurtenis onchangeom het invoerbestandselement door te geven aan uw functie.

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

Dus wanneer een gebruiker een bestand selecteert, heeft u een verwijzing naar het bestand zonder dat de gebruiker op de knop “Toevoegen” of “Uploaden” hoeft te klikken.

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

Antwoord 7, autoriteit 3%

Ik heb alle alternatieven geprobeerd die @Anoyz (juist antwoord) geeft… en de beste oplossing is https://github.com/danialfarid/angular-file-upload

Enkele functies:

  • Voortgang
  • Meerdere bestanden
  • Velden
  • Oude browsers (IE8-9)

Het werkt prima voor mij. Je hoeft alleen maar op de instructies te letten.

Aan de serverzijde gebruik ik NodeJs, Express 4 en Multer middleware om verzoeken uit meerdere delen te beheren.


Antwoord 8, autoriteit 3%

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>

Scripts

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


Antwoord 9, autoriteit 3%

Het <input type=file>element werkt standaard niet met de ng-model richtlijn. Het heeft een aangepaste richtlijnnodig:

Werkdemo van select-ng-files-richtlijn die werkt met ng-model1

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>

Antwoord 10, autoriteit 2%

Eenvoudig met een richtlijn

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

In de richtlijn zorgen we ervoor dat er een nieuw bereik wordt gemaakt en luisteren we vervolgens naar wijzigingen die zijn aangebracht in het bestandsinvoerelement. Wanneer er wijzigingen worden gedetecteerd, verzendt u een gebeurtenis naar alle voorouderbereiken (naar boven) met het bestandsobject als parameter.

In je controller:

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

Vervolgens in je ajax-oproep:

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

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


Antwoord 11, autoriteit 2%

ik denk dat dit de hoekige bestandsupload is:

ng-file-upload

Lichtgewicht Angular JS-richtlijn om bestanden te uploaden.

Hier is de DEMOpagina.Features

  • Ondersteunt de voortgang van het uploaden, annuleren / afbreken uploaden tijdens de uitvoering, bestandslepen en neerzetten (HTML5), Directory Drag en Drop (Webkit), CORS, PUT (HTML5) / postmethoden, validatie van bestandstype en -grootte, Toon een voorbeeld van geselecteerde afbeeldingen / audio / video’s.
  • Cross Browser Bestand Upload en FileReader (HTML5 en Non-HTML5) met Flash Polyfill FileAPI. Hiermee kunt u Client Side-validatie / -wijziging toe voordat u het bestand uploadt
  • Direct upload naar DB Services CouchDB, Imgur, enz … met het inhoudstype van het bestand met upload.http (). Hierdoor kunnen vooruitgangsevenement voor hoekige HTTP-post- / put-aanvragen.
  • SEPERATE SHIM-bestand, FileAPI-bestanden worden op aanvraag geladen voor niet-HTML5-code die geen extra belasting / code betekent als u alleen HTML5-ondersteuning nodig hebt.
  • Lichtgewicht met behulp van gewone $ HTTP om te uploaden (met shim voor niet-HTML5-browsers), zodat alle hoekige $ HTTP-functies beschikbaar zijn

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


12, Autoriteit 2%

Uw bestand en JSON-gegevens uploaden tegelijkertijd.

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

Antwoord 13

U kunt een FormData-object gebruiken dat veilig en snel is:

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

Antwoord 14

http://jsfiddle.net/vishalvasani/4hqVu/werkt prima in Chrome en IE ( als je CSS een beetje bijwerkt in de achtergrondafbeelding).
Dit wordt gebruikt om de voortgangsbalk bij te werken:

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

maar in FireFox worden de [procent] gegevens van angular niet geüpdatet in DOM, hoewel bestanden wel succesvol worden geüpload.


Antwoord 15

U kunt IaaS overwegen voor het uploaden van bestanden, zoals Uploadcare. Er is een Angular-pakket voor: https://github.com/uploadcare/angular-uploadcare

Technisch gezien is het geïmplementeerd als een richtlijn en biedt het verschillende opties voor uploaden en manipulaties voor geüploade afbeeldingen in de widget:

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

Meer configuratie-opties om mee te spelen: https://uploadcare.com/widget/configure/


Antwoord 16

Ik weet dat dit een late invoer is, maar ik heb een eenvoudige uploadrichtlijn gemaakt. Waar je in een mum van tijd mee aan de slag kunt!

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

NG-Simple-upload Meer op GitHub met een voorbeeld met behulp van Web API.


17

HTML

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

Voeg de methode ‘ProfielImage () aan op uw controller

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

18

Dit zou een update / commentaar moeten zijn op @ jQuery-guru’s antwoord, maar omdat ik niet genoeg vertegenwoordiger heb, zal het hierheen gaan. Het repareert de fouten die nu worden gegenereerd door de Code.

https://jsfiddle.net/vzhrqotw/

De wijziging is eigenlijk:

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

naar:

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

Voel je vrij om desgewenst naar een meer geschikte locatie te gaan.


19

Ik heb de hele thread gelezen en de HTML5 API-oplossing zag er het beste uit. Maar het verandert mijn binaire bestanden en corrumpeert ze op een manier die ik niet heb onderzocht. De oplossing die perfect werkte voor mij was:

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

Serverzijde (PHP):

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

Antwoord 20

Ik kan bestanden uploaden met AngularJS door onderstaande code te gebruiken:

Het filevoor het argument dat moet worden doorgegeven voor de functie ngUploadFileUploadis $scope.filevolgens uw vraag.

Het belangrijkste punt hier is om transformRequest: []te gebruiken. Dit voorkomt dat $http knoeit met de inhoud van het bestand.

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

Antwoord 21

Bovenstaand geaccepteerd antwoord is niet browser-compatibel. Als iemand een compatibiliteitsprobleem heeft, probeer dit dan.

Fiddle

Code bekijken

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

Controllercode

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

Antwoord 22

in eenvoudige woorden

in Html –voeg alleen onderstaande code toe

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

in de controller– Deze functie wordt aangeroepen wanneer u op “upload-bestandsknop”klikt. het zal het bestand uploaden. je kunt het troosten.

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

voeg meer toe in controllers– onderstaande code voegt toe aan de functie . Deze functie wordt aangeroepen wanneer u op een knop klikt die wordt gebruikt “hitting the api (POST)”. het zal het bestand (dat is geüpload) en formuliergegevens naar de backend sturen.

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

in dit geval .. ik heb onderstaande code toegevoegd als formuliergegevens

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

Antwoord 23

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

In angularJS-controller

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

Antwoord 24

We hebben HTML, CSS en AngularJS gebruikt. Het volgende voorbeeld laat zien hoe u het bestand uploadt met 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>

25

De code helpt bij het invoegen van bestand

<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="https://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);
?>

26

Dit werkt

bestand.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);
  ?>

Antwoord 27

BESTANDEN UPLOADEN

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

DOWNLOAD BESTANDEN:

         <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):/);
            }]);

28

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

Other episodes