File Upload using AngularJS

前端 未结 29 2029
野趣味
野趣味 2020-11-21 07:24

Here is my HTML form:

相关标签:
29条回答
  • 2020-11-21 08:04
    <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;
        }
    
    0 讨论(0)
  • 2020-11-21 08:05

    I've read all the thread and the HTML5 API solution looked the best. But it changes my binary files, corrupting them in a manner I've not investigated. The solution that worked perfectly for me 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);
    }
    

    Server side (PHP):

    $file_content = $_POST['file'];
    $file_content = substr($file_content,
        strlen('data:text/plain;base64,'));
    $file_content = base64_decode($file_content);
    
    0 讨论(0)
  • 2020-11-21 08:05

    Above accepted answer is not browser compatible. If some one has compatibility issue try this.

    Fiddle

    View Code

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

    Controller code

    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 讨论(0)
  • 2020-11-21 08:07

    You can use a FormData object which is safe and fast:

    // 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);
        });
    }
    
    0 讨论(0)
  • 2020-11-21 08:09

    in simple words

    in Html - add below code only

         <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 the controller - This function is called when you click "upload file button". it will upload the file. you can console it.

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

    add more in controllers - below code add into the function . This function is called when you click on button which is used "hitting the api (POST)". it will send file(which uploaded) and form-data to the backend .

    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 this case .. i added below code as form data

    var data ={
              msg : message,
              sub : sub,
              sendMail: sendMail,
              selectUsersAcknowledge:false
             };
    
    0 讨论(0)
  • 2020-11-21 08:10

    Use the onchange event to pass the input file element to your function.

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

    So when a user selects a file, you have a reference to it without the user needing to click an "Add" or "Upload" button.

    $scope.fileSelected = function (element) {
        var myFileSelected = element.files[0];
    };
    
    0 讨论(0)
提交回复
热议问题