我有一个二input text和一的表格upload。我必须将其发送到服务器,但是将文件与文本连接时遇到一些问题。服务器希望得到以下答案:
input text
upload
"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,响应为:Multipart form parse error - Invalid boundary in multipart: None。请求的有效负载为:{"title":"sadf","text":"sdfsadf","file":{}}
Multipart form parse error - Invalid boundary in multipart: None
{"title":"sadf","text":"sdfsadf","file":{}}
不要序列FormData与POST荷兰国际集团服务器。做这个:
FormData
POST
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);