如何修复 ASP.NET 核心文件上传空文件
How to fix ASP.NET Core File Upload empty file
我正在尝试将 csv 文件从 Angular 上传到 Asp.NET Core webapi。
但是,尽管 Fiddler 显示某些内容已通过网络传输,但在 web 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
我正在使用它并且有效:
[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>
您不能绑定到 object
类型的操作参数。相反,我想你 可以 但它不会为你做任何事情,因为 object
没有属性。因此,模型绑定器将简单地丢弃发布的所有内容。
如果您尝试在该参数中接受上传,那么它应该是 IFormFile
类型。如果您尝试接受 JSON 负载,那么它应该是您创建的用于表示该负载的实际 class。例如,如果您要发送 JSON,例如:
{
"foo": "bar"
}
然后,你需要一个class像:
public class MyDTO
{
public string Foo { get; set; }
}
如果您尝试将上传作为 JSON 负载的一部分发送,那么您的 DTO class 应该有一个以密钥命名的 byte[]
属性文件上传的地址,您的上传数据应以 Base 64 格式发送。例如:
{
// other stuff
"file": "{base64 encoded byte array}"
}
像这样的 DTO:
public class MyDTO
{
// other properties
public byte[] File { get; set; }
}
我正在尝试将 csv 文件从 Angular 上传到 Asp.NET Core webapi。 但是,尽管 Fiddler 显示某些内容已通过网络传输,但在 web 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
我正在使用它并且有效:
[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>
您不能绑定到 object
类型的操作参数。相反,我想你 可以 但它不会为你做任何事情,因为 object
没有属性。因此,模型绑定器将简单地丢弃发布的所有内容。
如果您尝试在该参数中接受上传,那么它应该是 IFormFile
类型。如果您尝试接受 JSON 负载,那么它应该是您创建的用于表示该负载的实际 class。例如,如果您要发送 JSON,例如:
{
"foo": "bar"
}
然后,你需要一个class像:
public class MyDTO
{
public string Foo { get; set; }
}
如果您尝试将上传作为 JSON 负载的一部分发送,那么您的 DTO class 应该有一个以密钥命名的 byte[]
属性文件上传的地址,您的上传数据应以 Base 64 格式发送。例如:
{
// other stuff
"file": "{base64 encoded byte array}"
}
像这样的 DTO:
public class MyDTO
{
// other properties
public byte[] File { get; set; }
}