Asp.net
Asp.Net Core WebAPI 中的 IFormFile 始終為空
當我嘗試使用 angularjs 控制器推送數據時,我遇到了問題。但是我所做的(IFormFile 文件)總是空的。只有一些使用剃刀語法的範例,但沒有使用 angular 或 jquery 的範例。
HTML:
<form class="form-body" enctype="multipart/form-data" name="newFileForm" ng-submit="vm.addFile()"><input type="file" id="file1" name="file" multiple ng-files="getTheFiles($files)"/></form>指示:
(function() { 'use strict'; angular .module('app') .directive('ngFiles', ['$parse', function ($parse) { function fn_link(scope, element, attrs) { var onChange = $parse(attrs.ngFiles); element.on('change', function (event) { onChange(scope, { $files: event.target.files }); }); }; return { link: fn_link }; }]); })();控制器
var formdata = new FormData(); $scope.getTheFiles = function ($files) { angular.forEach($files, function (key, value) { formdata.append(key, value); }); }; vm.addFile = function () { var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader("Content-Type", "undefined"); xhr.send(formdata); }Asp.net 核心 webapi:
[HttpPost] public async Task<IActionResult> PostProductProjectFile(IFormFile file) { if (!ModelState.IsValid) { return BadRequest(ModelState); } .... return ...; }我也嘗試過使用 formdata 來實現,因為它是在您使用 razor 語法發佈時建構的。像這樣的東西:
dataService.addFile(formdata, { contentDisposition: "form-data; name=\"files\"; filename=\"C:\\Users\\UserName\\Desktop\\snip_20160420091420.png\"", contentType: "multipart/form-data", headers: { "Content-Disposition": "form-data; name=\"files\"; filename=\"C:\\Users\\UserName\\Desktop\\snip_20160420091420.png\"", 'Content-Type': "image/png" }, fileName: "C:\\Users\\UserName\\Desktop\\snip_20160420091420.png", name: "files", length : 3563 }正如我在評論中所寫的那樣,也代替 formData 來提供原始文件。但仍然沒有任何反應
這是使用 angularjs 的方法:
vm.addFile = function () { var fileUpload = $("#file").get(0); var files = fileUpload.files; var data = new FormData(); for (var i = 0; i < files.length ; i++) { data.append(files[i].name, files[i]); } $http.post("/api/Files/", data, { headers: { 'Content-Type': undefined }, transformRequest: angular.identity }).success(function (data, status, headers, config) { }).error(function (data, status, headers, config) { }); }在網路 API 中:
[HttpPost] public async Task<IActionResult> PostFile() { //Read all files from angularjs FormData post request var files = Request.Form.Files; var strigValue = Request.Form.Keys; ..... }或者像這樣:
[HttpPost] public async Task<IActionResult> PostFiles(IFormCollection collection) { var f = collection.Files; foreach (var file in f) { //.... } }
只有當您輸入的名稱與您的方法參數名稱相同時,IFormFile 才會起作用。在您的情況下,輸入名稱是“文件”,方法參數名稱是“文件”。使它們相同,它應該可以工作。