在Asp.Net Core WebAPI中,IFormFile始终为空

err*_*505 11 asp.net file-upload angularjs asp.net-core

当我尝试使用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>
Run Code Online (Sandbox Code Playgroud)

指示:

(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
    };
    }]);
})();
Run Code Online (Sandbox Code Playgroud)

调节器

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);          
    }
Run Code Online (Sandbox Code Playgroud)

Asp.net核心webapi:

[HttpPost]
    public async Task<IActionResult> PostProductProjectFile(IFormFile file)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        ....
        return ...;
    }
Run Code Online (Sandbox Code Playgroud)

我也尝试用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
            }
Run Code Online (Sandbox Code Playgroud)

也就是我在评论中写的而不是formData来提供原始文件.但仍然没有任何反应

err*_*505 24

这是如何使用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) {

                });
}
Run Code Online (Sandbox Code Playgroud)

在网络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;
 .....
}
Run Code Online (Sandbox Code Playgroud)

或者像这样:

    [HttpPost]
    public async Task<IActionResult>  PostFiles(IFormCollection collection)
    {
        var f = collection.Files;                         

            foreach (var file in f)
            {
                //....
             }           
    }
Run Code Online (Sandbox Code Playgroud)


小智 20

只有输入名称与方法参数名称相同时,IFormFile才有效.在您的情况下,输入名称是"files",方法参数名称是"file".使它们相同,它应该工作.

  • 几个小时以来,我一直试图弄清楚这一点,对我来说,这是缺失的部分。 (3认同)