Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用AngularJS中的其他字段发送FormData_Angularjs_Http_Http Post_Multipartform Data_Form Data - Fatal编程技术网

使用AngularJS中的其他字段发送FormData

使用AngularJS中的其他字段发送FormData,angularjs,http,http-post,multipartform-data,form-data,Angularjs,Http,Http Post,Multipartform Data,Form Data,我有一个表单,有两个输入文本和一个上传。我必须将其发送到服务器,但在将文件与文本连接起来时遇到了一些问题。服务器需要以下答案: "title=first_input" "text=second_input" "file=my_file.pdf" 这是html: <input type="text" ng-model="title"> <input type="text" ng-model="text"> <input type="file" file-model=

我有一个表单,有两个
输入文本
和一个
上传
。我必须将其发送到服务器,但在将文件与文本连接起来时遇到了一些问题。服务器需要以下答案:

"title=first_input" "text=second_input" "file=my_file.pdf"
这是html

<input type="text" ng-model="title">
<input type="text" ng-model="text">
<input type="file" file-model="myFile"/>
<button ng-click="send()">
$scope.title = null;
$scope.text = null;

$scope.send = function(){
  var file = $scope.myFile;
  var uploadUrl = 'my_url';
  blockUI.start();
  Add.uploadFileToUrl(file, $scope.newPost.title, $scope.newPost.text, uploadUrl);
};
这是指令文件模型:

  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]);
    });
  });
}
};
这是调用服务器的服务

  this.uploadFileToUrl = function(file, title, text, uploadUrl){
   var fd = new FormData();
   fd.append('file', file);
   var obj = {
     title: title,
     text: text,
     file: fd
   };
   var newObj = JSON.stringify(obj);

     $http.post(uploadUrl, newObj, {
       transformRequest: angular.identity,
       headers: {'Content-Type': 'multipart/form-data'}
     })
  .success(function(){
    blockUI.stop();
  })
  .error(function(error){
    toaster.pop('error', 'Errore', error);
  });
}
如果我尝试发送,则得到错误400,响应为:
多部分表单解析错误-多部分中的无效边界:无

请求的有效负载是:
{“title”:“sadf”,“text”:“sdfsadf”,“file”:{}

您正在将JSON格式的数据发送到不需要该格式的服务器。您已经提供了服务器所需的格式,因此您需要自己对其进行格式化,这非常简单

var data = '"title='+title+'" "text='+text+'" "file='+file+'"';
$http.post(uploadUrl, data)

这是行不通的,你不能将FormData对象字符串化

您应该这样做:

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

不要使用
POST
ing将
FormData
序列化到服务器。这样做:

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
    });
}
然后使用它:

MyService.uploadFileToUrl(file, title, text, uploadUrl).then(successCallback).catch(errorCallback);

在AngularJS中使用
$resource
,您可以执行以下操作:

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
                    }
                })
            }
        };
    }
]);
$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
    }
}
然后在模块中使用它:

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

这是完整的解决方案

html代码

创建文本anf文件上载字段,如下所示

    <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>
服务代码

将文件和字段追加到表单数据中,并执行$http.post,如下所示 记住保留“内容类型”:未定义

 .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(){
            });
    }
}]);
内部控制器

现在,在控制器中,通过发送附加在参数中的所需数据来调用服务

$scope.saveData  = function(model){
    var file = model.myFile;
    var uploadUrl = "/api/createUsers";
    fileUpload.uploadFileToUrl(file, model.username, model.password, model.dob, model.email, uploadUrl);
};

假设我们希望使用POST方法从PHP服务器获取特定图像的列表

必须在表单中为POST方法提供两个参数。下面是你将要做的事情

app.controller('gallery-item', function ($scope, $http) {

    var url = 'service.php'; 

    var data = new FormData();

    data.append("function", 'getImageList');
    data.append('dir', 'all');

    $http.post(url, data, {
        transformRequest: angular.identity,
        headers: {'Content-Type': undefined}
      }).then(function (response) {

          // This function handles success
        console.log('angular:', response);

    }, function (response) {

        // this function handles error

    });
});

我已经在我的系统上对它进行了测试,它可以正常工作。

你序列化
FormData
有什么原因吗?因为在我的服务中,我写过:var data='“title='+title+'”“text='+text+'”“file='+file+'$http.post(uploadUrl,data,{transformRequest:angular.identity,headers:{'Content-Type':'multipart/formdata'}}),响应是:“多部分表单解析错误-多部分中的无效边界:无”。。事实上,如果我看到有效负载请求,它是:“title=Aasd”“text=njkop蔓file=undefined”…为什么?我稍微更改了代码。现在,它使用传递到uploadFileToUrl函数中的参数,该函数将包括“file”参数。试试看。总是没有定义…://问题出在后端控制器上。不是Javascript。我不管理后端,我会问我的朋友是谁做的。另外,你写了fd.append,但我想它们都是payload.append,对吧?是的。我的错。有效负载为FD可能由于文件未定义而出错?查看请求负载:------------185657102119953796721894889690内容处置:表单数据;name=“title”tgrfdc------------------185657102119953796721894889690内容处置:表单数据;name=“text”tgfrds------------------185657102119953796721894889690内容处置:表单数据;name=“file”未定义------------------185657102119953796721894889690--这是问题所在,服务器请求该文件,但无法取消定义。。。但是我解决了,因为我没有加载包含上传指令的文件…哈哈,非常感谢,我使用了你的解决方案。再次感谢