postman ASPNetCore -通过REST上载文件

643ylb08  于 2022-11-29  发布在  Postman
关注(0)|答案(2)|浏览(182)

我正在使用Insomnia测试API,但同样的情况也发生在Postman身上。
我想使用以下控制器测试文件上传:

public async Task<IActionResult> Post([FromForm]IFormFile File)

如果将请求设置为多部分请求:

它起作用了。
但是,如果我将其设置为二进制文件:

我不知道如何获取数据,如何才能做到呢?
此外,在控制器方法的签名中,如果我将[FromForm]更改为[FromBody],我将无法获取数据。
有人能为我澄清一下吗?

ttygqcqt

ttygqcqt1#

正如您已经注意到的,在Postman/Insomnia中使用binary file选项并不是标准的工作方式。通过RESTful API上传文件有三种不同的方式,您必须选择一种。
我已经包含了一些代码片段,它们将上传的文件内容读取到一个字符串中并输出--尝试发送一个文本文件,您应该在200响应中获得文件的内容。

    • 表单数据上传**

这是最流行的上传方法,它将您发送的数据格式化为一组键/值对。您通常需要在请求中指定Content-Typemultipart/form-data,然后使用MVC中的[FromForm]属性将值绑定到变量。此外,您可以使用内置的IFormFile类来访问上传的文件。

[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或其他编码来编码,以防止字符编码/解码问题,特别是当你发送图像或二进制数据时。

{
    "file": "MTIz"
}

然后在控制器内指定[FromBody],并使用类进行模型反序列化。

[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.您可能希望在应用程序中使用Streambyte[],以避免文件数据编码问题.
a8jjtwal

a8jjtwal2#

除上述内容外,在将多部分文件转换为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的此代码

相关问题