ASPNetCore - 通过 REST 上传文件
ASPNetCore - Uploading a file through REST
我正在使用 Insomnia 测试 API,但 Postman 也是如此。
我想使用以下控制器测试文件上传:
public async Task<IActionResult> Post([FromForm]IFormFile File)
如果我将请求设置为多部分请求:
有效。
但是,如果我将它设置为二进制文件:
我不知道如何获取数据。怎么做到的?
此外,在控制器方法的签名中,如果我将 [FromForm] 更改为 [FromBody],我将无法获取数据。
有人可以为我澄清一下吗?
正如您已经注意到的,在 Postman/Insomnia 中使用 binary file
选项不是标准方法。通过RESTfulAPI上传文件有3种不同的方式,你必须选择一种。
我包含了将上传的文件内容读取为字符串并将其输出的代码片段 -- 尝试发送一个文本文件,您应该在 200 响应中获取文件的内容。
表单-数据上传
这是最 popular/well-known 的上传方法,将您发送的数据格式化为一组 key/value 对。您通常需要在请求中指定 Content-Type
到 multipart/form-data
,然后在 MVC 中使用 [FromForm]
属性将值绑定到变量。另外,您可以使用内置的 IFormFile
class 来访问上传的文件。
[HttpPost]
public async Task<IActionResult> PostFormData([FromForm] IFormFile file)
{
using (var sr = new StreamReader(file.OpenReadStream()))
{
var content = await sr.ReadToEndAsync();
return Ok(content);
}
}
正文上传
您可以以 MVC 理解的格式发送正文,例如JSON,并将文件嵌入其中。通常,文件内容将使用 Base64 或其他编码进行编码,以防止出现字符 encoding/decoding 问题,尤其是在您发送图像或二进制数据时。例如
{
"file": "MTIz"
}
然后在控制器中指定 [FromBody]
,并使用 class 进行模型反序列化。
[HttpPost]
public IActionResult PostBody([FromBody] UploadModel uploadModel)
{
var bytes = Convert.FromBase64String(uploadModel.File);
var decodedString = Encoding.UTF8.GetString(bytes);
return Ok(decodedString);
}
// ...
public class UploadModel
{
public string File { get; set; }
}
当使用大文件和非文本文件时,JSON 请求变得笨拙且难以阅读。
二进制文件
这里的关键点是您的文件是整个请求。该请求不包含任何其他信息来帮助 MVC 将值绑定到代码中的变量。因此,要访问该文件,您需要读取 Request
.
中的 Body
[HttpPost]
public async Task<IActionResult> PostBinary()
{
using (var sr = new StreamReader(Request.Body))
{
var body = await sr.ReadToEndAsync();
return Ok(body);
}
}
注意: 示例将 Body
读作 string
。您可能希望在应用程序中使用 Stream
或 byte[]
以避免文件数据编码问题。
除上述之外,如果多部分文件转换为base64String,您可以参考以下内容:
if (File.Length> 0)
{
using (var ms = new MemoryStream())
{
File.CopyTo(ms);
var fileBytes = ms.ToArray();
string s = Convert.ToBase64String(fileBytes);
}
}
注意:我将此代码用于 .NET CORE 2.1
我正在使用 Insomnia 测试 API,但 Postman 也是如此。
我想使用以下控制器测试文件上传:
public async Task<IActionResult> Post([FromForm]IFormFile File)
如果我将请求设置为多部分请求:
有效。
但是,如果我将它设置为二进制文件:
我不知道如何获取数据。怎么做到的?
此外,在控制器方法的签名中,如果我将 [FromForm] 更改为 [FromBody],我将无法获取数据。
有人可以为我澄清一下吗?
正如您已经注意到的,在 Postman/Insomnia 中使用 binary file
选项不是标准方法。通过RESTfulAPI上传文件有3种不同的方式,你必须选择一种。
我包含了将上传的文件内容读取为字符串并将其输出的代码片段 -- 尝试发送一个文本文件,您应该在 200 响应中获取文件的内容。
表单-数据上传
这是最 popular/well-known 的上传方法,将您发送的数据格式化为一组 key/value 对。您通常需要在请求中指定 Content-Type
到 multipart/form-data
,然后在 MVC 中使用 [FromForm]
属性将值绑定到变量。另外,您可以使用内置的 IFormFile
class 来访问上传的文件。
[HttpPost]
public async Task<IActionResult> PostFormData([FromForm] IFormFile file)
{
using (var sr = new StreamReader(file.OpenReadStream()))
{
var content = await sr.ReadToEndAsync();
return Ok(content);
}
}
正文上传
您可以以 MVC 理解的格式发送正文,例如JSON,并将文件嵌入其中。通常,文件内容将使用 Base64 或其他编码进行编码,以防止出现字符 encoding/decoding 问题,尤其是在您发送图像或二进制数据时。例如
{
"file": "MTIz"
}
然后在控制器中指定 [FromBody]
,并使用 class 进行模型反序列化。
[HttpPost]
public IActionResult PostBody([FromBody] UploadModel uploadModel)
{
var bytes = Convert.FromBase64String(uploadModel.File);
var decodedString = Encoding.UTF8.GetString(bytes);
return Ok(decodedString);
}
// ...
public class UploadModel
{
public string File { get; set; }
}
当使用大文件和非文本文件时,JSON 请求变得笨拙且难以阅读。
二进制文件
这里的关键点是您的文件是整个请求。该请求不包含任何其他信息来帮助 MVC 将值绑定到代码中的变量。因此,要访问该文件,您需要读取 Request
.
Body
[HttpPost]
public async Task<IActionResult> PostBinary()
{
using (var sr = new StreamReader(Request.Body))
{
var body = await sr.ReadToEndAsync();
return Ok(body);
}
}
注意: 示例将 Body
读作 string
。您可能希望在应用程序中使用 Stream
或 byte[]
以避免文件数据编码问题。
除上述之外,如果多部分文件转换为base64String,您可以参考以下内容:
if (File.Length> 0)
{
using (var ms = new MemoryStream())
{
File.CopyTo(ms);
var fileBytes = ms.ToArray();
string s = Convert.ToBase64String(fileBytes);
}
}
注意:我将此代码用于 .NET CORE 2.1