使用 AngularJS 和 ngResource 将范围变量转换为 FormData (multipart/form-data) 时出现问题

Trouble converting scope variable to FormData (multipart/form-data) using AngularJS and ngResource

编辑:

已修复

不要将 Content-Type 设置为字符串 'undefined' 而是使用 undefined 来代替,这样效果会更好。

我目前正在使用 this 关于如何将表单(带文件)转换为 multipart/form-data 的解决方案,但为了便于阅读,我将解释我使用的内容。

后台在ASP.NET5.

我正在使用此指令将文件输入绑定到 angular 范围变量:

var app = angular.module('app', ['ngResource'])
                        .directive('filesModel', filesModelDirective);

function filesModelDirective() {
    return {
        controller: function ($parse, $element, $attrs, $scope) {
            var exp = $parse($attrs.filesModel);

            $element.on('change', function () {
                exp.assign($scope, this.files);
                $scope.$apply();
            });
        }
    };
}

然后在页面上这样做:

<input type="file" files-model="newvisit.files" id="inputImage" />

这是在ngResource中使用的,这就是出错的地方。如果你使用调试器;您可以看到每个值及其键,它还正确地附加了文件。

save: {
    method: 'POST',
    transformRequest: function (data) {
        if (data === undefined) return data;

        var fd = new FormData();
        angular.forEach(data, function (value, key) {
            if (value instanceof FileList) {
                if (value.length == 1) {
                    fd.append(key, value[0]);
                } else {
                    angular.forEach(value, function (file, index) {
                        fd.append(key + '_' + index, file);
                    });
                }
            } else {
                fd.append(key, value);
            }
        });

        return fd;
    },
    headers: { 'Content-Type': 'undefined', enctype: 'multipart/form-data' }
 }

我可以在 postman 中创建一个 multipart/form-data post,后端将接受它,如下所示。

自定义 post:

后端:

请忽略'files'变量名,已经改成'data'

然而,当在网页上填写表格并让 Angular 创建一个 FormData() object 它没有正确格式化(?不知道该放什么),我截获了这使用邮递员:

而且后端将无法投射。

可以看到截取的post中的相关header'Content-Type'和'enctype'被正确设置为'undefined'和'multipart/form-data'

我不确定问题是否出在 ASP.NET 5 的某个地方,但是因为它可以接受自定义 post 我不确定。

编辑:我只是尝试手动将 headers 'Content-Type': 'undefined' 和 'enctype': 'multipart/form-data' 放入我的自定义 post而且它不起作用,ASP.NET 是这里不够用还是我做错了什么?

EDIT2:我通过取消设置 'Content-Type' header 并设置 'enctype' header 让我的自定义 post 再次工作,我不能把 'Content-Type' 放在 undefined 上,否则 ASP.NET 不会接受。 (如果我查看成功请求 HeaderContentType 的 headers 设置为未定义)

这可能是 ASP.NET 的错误吗?

不要把你的 Content-Type 作为字符串 'undefined' 孩子们,使用 undefined 代替。