Send FormData with other field in AngularJS

前端 未结 5 1003
天涯浪人
天涯浪人 2020-11-28 09:46

I have a form with two input text and one upload. I have to send it to the server but I have some problem concatenating the file with the text. The

相关标签:
5条回答
  • 2020-11-28 10:20

    Here is the complete solution

    html code,

    create the text anf file upload fields as shown below

        <div class="form-group">
            <div>
                <label for="usr">User Name:</label>
                <input type="text" id="usr" ng-model="model.username">
            </div>
            <div>
                <label for="pwd">Password:</label>
                <input type="password" id="pwd" ng-model="model.password">
            </div><hr>
            <div>
                <div class="col-lg-6">
                    <input type="file" file-model="model.somefile"/>
                </div>
    
    
            </div>
            <div>
                <label for="dob">Dob:</label>
                <input type="date" id="dob" ng-model="model.dob">
            </div>
            <div>
                <label for="email">Email:</label>
                <input type="email"id="email" ng-model="model.email">
            </div>
    
    
            <button type="submit" ng-click="saveData(model)" >Submit</button>
    

    directive code

    create a filemodel directive to parse file

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

    Service code

    append the file and fields to form data and do $http.post as shown below remember to keep 'Content-Type': undefined

     .service('fileUploadService', ['$http', function ($http) {
        this.uploadFileToUrl = function(file, username, password, dob, email, uploadUrl){
            var myFormData = new FormData();
    
            myFormData.append('file', file);
            myFormData.append('username', username);
            myFormData.append('password', password);
            myFormData.append('dob', dob);
            myFormData.append('email', email);
    
    
            $http.post(uploadUrl, myFormData, {
                transformRequest: angular.identity,
                headers: {'Content-Type': undefined}
            })
                .success(function(){
    
                })
                .error(function(){
                });
        }
    }]);
    

    In controller

    Now in controller call the service by sending required data to be appended in parameters,

    $scope.saveData  = function(model){
        var file = model.myFile;
        var uploadUrl = "/api/createUsers";
        fileUpload.uploadFileToUrl(file, model.username, model.password, model.dob, model.email, uploadUrl);
    };
    
    0 讨论(0)
  • 2020-11-28 10:29

    This never gonna work, you can't stringify your FormData object.

    You should do this:

    this.uploadFileToUrl = function(file, title, text, uploadUrl){
       var fd = new FormData();
       fd.append('title', title);
       fd.append('text', text);
       fd.append('file', file);
    
         $http.post(uploadUrl, obj, {
           transformRequest: angular.identity,
           headers: {'Content-Type': undefined}
         })
      .success(function(){
        blockUI.stop();
      })
      .error(function(error){
        toaster.pop('error', 'Errore', error);
      });
    }
    
    0 讨论(0)
  • 2020-11-28 10:35

    You're sending JSON-formatted data to a server which isn't expecting that format. You already provided the format that the server needs, so you'll need to format it yourself which is pretty simple.

    var data = '"title='+title+'" "text='+text+'" "file='+file+'"';
    $http.post(uploadUrl, data)
    
    0 讨论(0)
  • 2020-11-28 10:37

    Don't serialize FormData with POSTing to server. Do this:

    this.uploadFileToUrl = function(file, title, text, uploadUrl){
        var payload = new FormData();
    
        payload.append("title", title);
        payload.append('text', text);
        payload.append('file', file);
    
        return $http({
            url: uploadUrl,
            method: 'POST',
            data: payload,
            //assign content-type as undefined, the browser
            //will assign the correct boundary for us
            headers: { 'Content-Type': undefined},
            //prevents serializing payload.  don't do it.
            transformRequest: angular.identity
        });
    }
    

    Then use it:

    MyService.uploadFileToUrl(file, title, text, uploadUrl).then(successCallback).catch(errorCallback);
    
    0 讨论(0)
  • 2020-11-28 10:43

    Using $resource in AngularJS you can do:

    task.service.js

    $ngTask.factory("$taskService", [
        "$resource",
        function ($resource) {
            var taskModelUrl = 'api/task/';
            return {
                rest: {
                    taskUpload: $resource(taskModelUrl, {
                        id: '@id'
                    }, {
                        save: {
                            method: "POST",
                            isArray: false,
                            headers: {"Content-Type": undefined},
                            transformRequest: angular.identity
                        }
                    })
                }
            };
        }
    ]);
    

    And then use it in a module:

    task.module.js

    $ngModelTask.controller("taskController", [
        "$scope",
        "$taskService",
        function (
            $scope,
            $taskService,
        ) {
        $scope.saveTask = function (name, file) {
            var newTask,
                payload = new FormData();
            payload.append("name", name);
            payload.append("file", file);
            newTask = $taskService.rest.taskUpload.save(payload);
            // check if exists
        }
    }
    
    0 讨论(0)
提交回复
热议问题