0

编辑:故障范围变量转换为FORMDATA(多/表单数据)使用AngularJS和ngResource

固定它

不要你的内容类型设置为字符串“未定义”,但使用undefined代替,往往效果更好。

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

后端是ASP.NET 5.

我使用此指令输入到角度范围可变文件绑定:

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文章,后端将接受它,如下所示。

自定义后:

Creating custom post in Postman

后端:

忽略 '文件' 变量的名字吗,已经改成了 '数据'

Backend accepts and casts it

然而在网页上填写表格并让Ang ular创建一个FormData()对象,它不格式化(?不知道放什么在这里)它正确,我拦截此使用邮差:

Postman intercept

和后端将无法投放。

Backend

你可以从截获后看到相关的报头“的Content-Type”和“加密类型”设置是否正确,以“不确定”和“多/表单数据”

Headers from intercepted post

我不确定问题出在ASP.NET 5的某个地方,但是因为它可以接受一个自定义的帖子我不确定。我试图手动把标题'内容类型':'未定义'和'enctype':'multipart/form-data'在我的自定义帖子中,它不起作用,是ASP.NET下降在这里缩短还是我做错了什么?我没有设置'内容类型'标题,并设置'enctype'标题,我不能把'内容类型'放在未定义的或ASP.NET不会将'不能',但我不能将'内容类型'放在未定义或ASP.NET不会接受。 (如果我看看成功的请求的头部HeaderContentType设置为undefined)

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

+0

exp.assign($ scope,this.files); < - 问题必须是,您操作文件输入的方式。你不能复制或克隆文件输入在HTML中,如果你这样做底层文件将会丢失,你不能再访问它..你必须直接与原始输入 –

+0

@DavitTvildiani这可能是一个问题,还不确定。目前我的问题在于ASP.NET不接受'Content-Type'的任何内容:'未定义'标题 – Matthew

+0

@Matthew如果您将'Register([FromForm]'更改为'Register([FromBody]'),会出现什么后果? –

回答

0

不要把你的Content-Type作为一个字符串'undefined'kids,而是使用undefined。