Asp.net

Asp.Net Core WebAPI 中的 IFormFile 始終為空

  • July 9, 2021

當我嘗試使用 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 才會起作用。在您的情況下,輸入名稱是“文件”,方法參數名稱是“文件”。使它們相同,它應該可以工作。

引用自:https://stackoverflow.com/questions/38144194