如何使用AngularJS $ http方法构建多部分MIME请求并将其发布到服务器API?
我正在尝试将图像上传到服务器。图片的二进制数据应该是请求的 body 的一部分,使用POST方法和多部分MIME完成。其余的查询参数可以作为查询字符串参数发送,也可以作为multipart MIME中的其他部分发送。这是对请求应该是什么样子的捕获:
POST https://webservice.platform.com/Service/V1/Service.ashx?Pictures_ProfilePhoto_Add HTTP/1.1
PlatformSDK: xxxyyyzzz
Host: webservice.platform.com
Content-Type: multipart/form-data; boundary=---------------------------8d084109e6bc7e4
Content-Length: 1789
Expect: 100-continue
-----------------------------8d084109e6bc7e4
Content-Disposition: form-data; name="ApplicationName"
name@domain.com - Sample App
-----------------------------8d084109e6bc7e4
Content-Disposition: form-data; name="ApplicationPassword"
xxxxxnnnnnrrrqqqwwwssss
-----------------------------8d084109e6bc7e4
Content-Disposition: form-data; name="UserToken"
AABBCCDDEEFFGG
-----------------------------8d084109e6bc7e4
Content-Disposition: form-data; name="ApplicationTag"
-----------------------------8d084109e6bc7e4
Content-Disposition: form-data; name="bytesFullPhotoData"; filename="bytesFullPhotoData"
Content-Type: application/octet-stream
�����JFIF��x�x�����C�
-----------------------------8d084109e6bc7e4--
答案 0 :(得分:1)
以下代码将获得您要求的结果,但您应该使用指令方法,如以下链接中所述http://odetocode.com/blogs/scott/archive/2013/07/05/a-file-input-directive-for-angularjs.aspx
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>How to construct a multipart MIME request and POST it using AngularJS' $http method?</title>
</head>
<body>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
<div id="appRoot">
<div ng-controller="TestCtrl">
<p>
<input type="text" placeholder="Name" ng-model="applicationName" />
<br />
<input type="password" placeholder="Password" ng-model="applicationPassword" />
<br />
<input type="text" placeholder="Token" ng-model="userToken" />
<br />
<input type="text" placeholder="Tag" ng-model="applicationTag" />
<br />
<input type="file" onchange="angular.element(this).scope().fileInputChanged(this);" id="fileInput" />
</p>
<button type="button" ng-click="uploadDocuments()">Upload</button>
</div>
</div>
<script type='text/javascript'>
'use strict';
var app = angular.module('app', []);
app.controller('TestCtrl', function ($scope, $http) {
$scope.filesToUpload = null;
$scope.fileInputChanged = function (element) {
$scope.$apply(function (scope) {
scope.fileToUpload = element.files[0];
});
};
$scope.uploadDocuments = function () {
var formData = new FormData();
formData.append("ApplicationName", $scope.applicationName);
formData.append("ApplicationPassword", $scope.applicationPassword);
formData.append("UserToken", $scope.userToken);
formData.append("ApplicationTag", $scope.applicationTag);
formData.append("BytesFullPhotoData", $scope.fileToUpload);
$http({
method: 'POST',
url: '/api/Image/Upload', //!++ Set your own location
// if you set Content-Type, ; boundary= won't be in header so set undefined which will force the browser to fill
//x headers: { 'Content-Type': 'multipart/form-data' },
headers: {
'Content-Type': undefined
},
data: formData,
transformRequest: function (data) {
return data;
}
}).success(uploadComplete).error(uploadFailed);
};
function uploadComplete(data, status, headers, config) {
$scope.filesToUpload = null;
var fileInput = $('#fileInput');
fileInput.replaceWith(fileInput = fileInput.clone(true));
console.log(data);
}
function uploadFailed(data, status, headers, config) {
console.log('Upload failed!');
}
});
angular.element(document).ready(function () {
angular.bootstrap(document.getElementById('appRoot'), ['app']);
});
</script>
</body>
</html>