【问题标题】:How to fix ASP.NET Core File Upload empty file如何修复 ASP.NET Core 文件上传空文件
【发布时间】:2018-08-30 20:00:07
【问题描述】:

我正在尝试将 csv 文件从 Angular 上传到 Asp.NET Core webapi。 但是,尽管 Fiddler 显示网络上有一些东西,但在网络 abi 上得到了空对象。 我正在使用 Kendo UI 上传文件。

你能告诉我如何解决这个问题吗?我试过 [FromBody] 和 [FromForm] 但没有区别。

    [HttpPost]
    [Route(ApiRoutes.EodVariationMargin)]
    public async Task<IActionResult> UploadPlugAsync(object plugs)
    {
        var content = JsonConvert.SerializeObject(plugs); 
        _logger.LogInformation(content);
        return Ok();
    }

Request Count:   1
Bytes Sent:      1,470      (headers:539; body:931)
Bytes Received:  198        (headers:198; body:0)

ACTUAL PERFORMANCE
--------------
ClientConnected:    11:34:36.511
ClientBeginRequest: 11:34:44.561
GotRequestHeaders:  11:34:44.561
ClientDoneRequest:  11:34:44.566
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect: 0ms
HTTPS Handshake:    0ms
ServerConnected:    11:34:36.512
FiddlerBeginRequest:    11:34:44.566
ServerGotRequest:   11:34:44.566
ServerBeginResponse:    11:35:15.629
GotResponseHeaders: 11:35:15.629
ServerDoneResponse: 11:35:15.629
ClientBeginResponse:    11:35:15.629
ClientDoneResponse: 11:35:15.630

    Overall Elapsed:    0:00:31.069

RESPONSE BYTES (by Content-Type)
--------------
~headers~: 198

【问题讨论】:

    标签: asp.net-core kendo-ui-angular2


    【解决方案1】:

    我正在使用它并且它有效:

    [Route("API/files")]
    public class FileController : Controller
    {
        [HttpPost("Upload")]
        public IActionResult SaveUploaded()
        {
            List<string> result = new List<string>();
            var files = this.Request.Form.Files;
            foreach (var file in files)
            {
                using (FileStream fs = System.IO.File.Create("Destination"))
                {
                    file.CopyTo(fs);
                    fs.Flush();
                }
                result.Add(file.FileName);
            }
            return result.ToJson();
        }
    }
    

    还有 Angular html:

    <kendo-upload saveUrl="API/Files/Upload"
                  ...>
    </kendo-upload>
    

    【讨论】:

    • 非常感谢您的回答。 this.Request.Form.Files 是解决方案。我的方法签名public async Task&lt;IActionResult&gt; UploadPlugAsync(IFormFile filePayload) 因为我也使用 Swagger 接口来测试方法。
    【解决方案2】:

    您不能绑定到 object 类型的操作参数。相反,我想你可以,但它不会为你做任何事情,因为object 没有属性。因此,modelbinder 将简单地丢弃所有发布的内容。

    如果您尝试在该参数中接受上传,那么它应该是IFormFile 类型。如果您尝试接受 JSON 有效负载,那么它应该是您创建以表示该有效负载的实际 class。例如,如果您发送 JSON 如下:

    {
        "foo": "bar"
    }
    

    那么,你需要一个像这样的类:

    public class MyDTO
    {
        public string Foo { get; set; }
    }
    

    如果您尝试将上传作为 JSON 有效负载的一部分发送,那么您的 DTO 类应具有以文件上传键命名的 byte[] 属性,并且您的上传数据应以 Base 64 格式发送。例如:

    {
        // other stuff
        "file": "{base64 encoded byte array}"
    }
    

    使用类似的 DTO:

    public class MyDTO
    {
        // other properties
        public byte[] File { get; set; }
    }
    

    【讨论】:

    • 谢谢,我把参数改成了IFormFile,这样我就可以用Swagger来测试这个方法了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2017-10-21
    • 2017-11-26
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多