Angularjs $http post file and form data

后端 未结 8 1127
广开言路
广开言路 2020-11-28 22:14

I have the below request in python

import requests, json, io

cookie = {}
payload = {\"Name\":\"abc\"}
url = \"/test\"
file = \"out/test.json\"

fi = {\'file         


        
相关标签:
8条回答
  • 2020-11-28 23:15

    here is my solution:

    // Controller
    $scope.uploadImg = function( files ) {
      $scope.data.avatar = files[0];
    }
    
    $scope.update = function() {
      var formData = new FormData();
      formData.append('desc', data.desc);
      formData.append('avatar', data.avatar);
      SomeService.upload( formData );
    }
    
    
    // Service
    upload: function( formData ) {
      var deferred = $q.defer();
      var url = "/upload"	;
      
      var request = {
        "url": url,
        "method": "POST",
        "data": formData,
        "headers": {
          'Content-Type' : undefined // important
        }
      };
    
      console.log(request);
    
      $http(request).success(function(data){
        deferred.resolve(data);
      }).error(function(error){
        deferred.reject(error);
      });
      return deferred.promise;
    }
    
    
    // backend use express and multer
    // a part of the code
    var multer = require('multer');
    var storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, '../public/img')
      },
      filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now() + '.jpg');
      }
    })
    
    var upload = multer({ storage: storage })
    app.post('/upload', upload.single('avatar'), function(req, res, next) {
      // do something
      console.log(req.body);
      res.send(req.body);
    });
    <div>
      <input type="file" accept="image/*" onchange="angular.element( this ).scope().uploadImg( this.files )">
      <textarea ng-model="data.desc" />
      <button type="button" ng-click="update()">Update</button>
    </div>

    0 讨论(0)
  • 2020-11-28 23:16

    I had similar problem when had to upload file and send user token info at the same time. transformRequest along with forming FormData helped:

            $http({
                method: 'POST',
                url: '/upload-file',
                headers: {
                    'Content-Type': 'multipart/form-data'
                },
                data: {
                    email: Utils.getUserInfo().email,
                    token: Utils.getUserInfo().token,
                    upload: $scope.file
                },
                transformRequest: function (data, headersGetter) {
                    var formData = new FormData();
                    angular.forEach(data, function (value, key) {
                        formData.append(key, value);
                    });
    
                    var headers = headersGetter();
                    delete headers['Content-Type'];
    
                    return formData;
                }
            })
            .success(function (data) {
    
            })
            .error(function (data, status) {
    
            });
    

    For getting file $scope.file I used custom directive:

    app.directive('file', function () {
        return {
            scope: {
                file: '='
            },
            link: function (scope, el, attrs) {
                el.bind('change', function (event) {
                    var file = event.target.files[0];
                    scope.file = file ? file : undefined;
                    scope.$apply();
                });
            }
        };
    });
    

    Html:

    <input type="file" file="file" required />
    
    0 讨论(0)
提交回复
热议问题