gpt4 book ai didi

angularjs - 如何使用 AngularJS POST 二进制文件(带上传 DEMO)

转载 作者:行者123 更新时间:2023-12-02 06:03:50 25 4
gpt4 key购买 nike

无法使用 Angular 后调用发送文件

我正在尝试通过 ionic 1 和 Angular 1 发布包含一些数据的 .mp4 文件。通过 POSTMAN 发布时,它很好并且工作正常。我的应用程序中收到 Success = false

在 POSTMAN 中,没有标题和数据,带有 POST 请求的服务 URL http://services.example.com/upload.php表单数据中的正文

j_id = 4124, type = text   
q_id = 6, type = text
u_id = 159931, type = text
file = demo.mp4, type = file

在我的应用程序中:

$rootScope.uploadQuestion = function () {

var form = new FormData();
form.append("j_id", "4124");
form.append("q_id", "6");
form.append("u_id", "159931");
form.append("file", $rootScope.videoAns.name); //this returns media object which contain all details of recorded video

return $http({
method: 'POST',
headers: { 'Content-Type': 'multipart/form-data' }, // also tried with application/x-www-form-urlencoded
url: 'http://services.example.com/upload.php',
// url: 'http://services.example.com/upload.php?j_id=4124&q_id=8&u_id=159931&file='+$rootScope.videoAns.fullPath,
// data: "j_id=" + encodeURIComponent(4124) + "&q_id=" + encodeURIComponent(8) + "&u_id=" + encodeURIComponent(159931) +"&file=" + encodeURIComponent($rootScope.videoAns),
data: form,
cache: false,
timeout: 300000
}).success(function (data, status, headers, config) {
if (status == '200') {
if (data.success == "true") {
alert('uploading...');
}


}


}).error(function (data, status, headers, config) {

});
}

最佳答案

推荐:直接发布二进制文件

使用 multi-part/form-data 发布二进制文件的效率很低,因为 base64 encoding额外增加 33% 的开销。如果服务器 API 接受带有二进制数据的 POST,则直接发布文件:

function upload(url, file) {
if (file.constructor.name != "File") {
throw new Error("Not a file");
}
var config = {
headers: {'Content-Type': undefined},
transformRequest: []
};
return $http.post(url, file, config)
.then(function (response) {
console.log("success!");
return response;
}).catch(function (errorResponse) {
console.error("error!");
throw errorResponse;
});
}

通常是$http service将 JavaScript 对象编码为 JSON strings 。使用 transformRequest: [] 覆盖默认转换。

<小时/>

DEMO of Direct POST

angular.module("app",[])
.directive("selectNgFiles", function() {
return {
require: "ngModel",
link: postLink
};
function postLink(scope, elem, attrs, ngModel) {
elem.on("change", function(event) {
ngModel.$setViewValue(elem[0].files);
});
}
})
.controller("ctrl", function($scope, $http) {
var url = "//httpbin.org/post";
var config = {
headers: { 'Content-type': undefined }
};
$scope.upload = function(files) {
var promise = $http.post(url,files[0],config);
promise.then(function(response){
$scope.result="Success "+response.status;
}).catch(function(errorResponse) {
$scope.result="Error "+errorRespone.status;
});
};
})
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="app" ng-controller="ctrl">
<input type="file" select-ng-files ng-model="files">
<br>
<button ng-disabled="!files" ng-click="upload(files)">
Upload file
</button>
<pre>
Name={{files[0].name}}
Type={{files[0].type}}
RESULT={{result}}
</pre>
</body>

<小时/>

使用 'Content-Type': 'multipart/form-data' 发布

使用 FormData API 发布数据时,将内容类型设置为 undefined 很重要:

function uploadQuestion(file) {

var form = new FormData();
form.append("j_id", "4124");
form.append("q_id", "6");
form.append("u_id", "159931");
form.append("file", file); //this returns media object which contain all details of recorded video

return $http({
method: 'POST',
headers: { 'Content-Type': undefined ̶'̶m̶u̶l̶t̶i̶p̶a̶r̶t̶/̶f̶o̶r̶m̶-̶d̶a̶t̶a̶'̶ }, // also tried with application/x-www-form-urlencoded
url: 'http://services.example.com/upload.php',
data: form,
̶c̶a̶c̶h̶e̶:̶ ̶f̶a̶l̶s̶e̶,̶
timeout: 300000
̶}̶)̶.̶s̶u̶c̶c̶e̶s̶s̶(̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶d̶a̶t̶a̶,̶ ̶s̶t̶a̶t̶u̶s̶,̶ ̶h̶e̶a̶d̶e̶r̶s̶,̶ ̶c̶o̶n̶f̶i̶g̶)̶ ̶{̶
}).then(function(response) {
var data = response.data;
var status = response.status;
if (status == '200') {
console.log("Success");
}
̶}̶)̶.̶e̶r̶r̶o̶r̶(̶f̶u̶n̶c̶t̶i̶o̶n̶ ̶(̶d̶a̶t̶a̶,̶ ̶s̶t̶a̶t̶u̶s̶,̶ ̶h̶e̶a̶d̶e̶r̶s̶,̶ ̶c̶o̶n̶f̶i̶g̶)̶ ̶{̶
}).catch(function(response) {
console.log("ERROR");
//IMPORTANT
throw response;
});
}

XHR API send method发送 FormData Object ,它会自动设置具有适当边界的内容类型 header 。当 $http service覆盖内容类型,服务器将获得没有正确边界的内容类型 header 。

关于angularjs - 如何使用 AngularJS POST 二进制文件(带上传 DEMO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55956946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com