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。