从angularjs将文件发布到web api时,内容类型为null

从angularjs将文件发布到web api时,内容类型为null,angularjs,html,file-upload,asp.net-web-api2,angular-http,Angularjs,Html,File Upload,Asp.net Web Api2,Angular Http,我正在尝试从AngularJs应用程序中使用web api上传文件。下面是我的代码 app.controller('RFCController',['$scope','$http',函数($scope,$http){ $scope.getFileDetails=函数(e){ $scope.files=[]; $scope.$apply(函数(){ //将文件对象存储在数组中。 对于(var i=0;i

我正在尝试从AngularJs应用程序中使用web api上传文件。下面是我的代码

app.controller('RFCController',['$scope','$http',函数($scope,$http){
$scope.getFileDetails=函数(e){
$scope.files=[];
$scope.$apply(函数(){
//将文件对象存储在数组中。
对于(var i=0;i

图像文件
提交

上载由创建的对象时,必须将内容类型标题设置为
未定义

$scope.uploadFiles = function () {

    //FILL FormData WITH FILE DETAILS.
    var data = new FormData();

    data.append("uploadedFile", $scope.files[0]);

    $http.post('../api/RFCService/upload', data, {
        //headers:{'Content-Type':'multipart/form-data'}
        //IMPORTANT
        headers:{'Content-Type': undefined }
    }).then(function (response) {
        alert("sucess!");
        },
        function (response) {
            alert("error!");
        });

}
通常,$http服务使用内容类型
application/json
覆盖。通过将标题设置为
未定义
,将自动设置带有零件边界的内容类型标题。强制使用没有内容边界的内容类型会导致问题


更好的方法是直接发送文件 对于内容类型
多部分/表单数据
而言,数据是可压缩的,这增加了33%的额外开销。直接发送文件即可:

$scope.uploadFiles = function () {

    //FILL FormData WITH FILE DETAILS.
    //var data = new FormData();

    //data.append("uploadedFile", $scope.files[0]);

    //USE file directly
    var file = $scope.file[0];

    return $http.post('../api/RFCService/upload', file, {
        //headers:{'Content-Type':'multipart/form-data'}
        //IMPORTANT
        headers:{'Content-Type': undefined }
    }).then(function (response) {
        console.log("success!");
        return response;
    }).catch(function (errorResponse) {
        console.error("error!");
        throw errorResponse;
    });
}
接受并为它们创建适当的头

还请注意,这些示例在日志记录后从和正确地返回承诺


AngularJS的旧版本 默认情况下,AngularJS$http服务设置内容类型头并将JavaScript对象序列化为JSON UTF-8字符串。$http服务的现代版本检测Blob、文件和FormData对象,并跳过序列化。对于旧版本,请使用
transformRequest:[]
配置以防止序列化

$scope.uploadFile = function (url, file) {

    var config = {
        headers: { 'Content-Type': undefined },
        tranformRequest: []
    };

    return $http.post(url, file, config)
      .then(function (response) {
        console.log("success!");
        return response;
    }).catch(function (errorResponse) {
        console.error("error!");
        throw errorResponse;
    });

}

最后,这就是我如何让它工作的。请参阅下面angularjs的调用

$scope.uploadFiles=函数(){
//用文件详细信息填充FormData。
var data=new FormData();
var file=$scope.files[0];
data.append(“uploadedFile”,file);
$http({
url:“../api/RFCService/upload”,
方法:“Post”,
数据:数据,
标题:{“内容类型”:未定义},
转换请求:angular.identity
}).然后(功能(响应){
警惕(“成功!”);
},
功能(响应){
警报(“错误!”);
});

}
如果将内容类型用作“多部分/表单数据”;charset=utf-8'?@Gonzalo。-是的,我试过了。还是一样的问题。谢谢回复。我尝试直接发送文件并将内容类型设置为未定义。但仍然面临同样的问题。内容类型在服务器端显示为null并返回相同的错误。我是否需要对Web Api方法进行任何更改以使其正常工作?请看一下WebAPI方法。这是我现在如何让它工作的。下面是代码。将代码发布为答案,但会将您的帖子标记为答案。更新了AngularJS旧版本的答案。您使用的是什么版本的AngularJS?只有V1.3.7之前的版本需要覆盖FormData对象的transformRequest。Blob对象的V1.3.0-beta.3之前版本。V1.0.0-rc2之前的版本,用于文件对象。