【问题标题】:Upload large file to API and store it ti blob将大文件上传到 API 并将其存储到 blob
【发布时间】:2020-02-02 05:24:33
【问题描述】:

我有一个简单的带有动作的 web api 控制器

[HttpPost]
public async Task<IActionResult> Add(IFormFile file)
{
    var firmware = await _firmwareManager.Add(
        new FirmwareAddDto
        {
            Name = file?.FileName,
            Version = version,
            Data = file?.OpenReadStream()
        });

    return StatusCode((int)HttpStatusCode.Created, firmware);
}

然后在管理器中,我有这段代码将流存储到 azure blob 存储

byte[] data = firmwareAddDto.Data.ToByteArray();
var blob = await _fileStorage.Add("filename", data);

我应该在这里处理一些东西吗?我要上传一个大文件。请告知它是否会正确处理

【问题讨论】:

  • 你能提供更多关于 _fileStorage 变量类型的细节吗?并确认是否存在以流作为输入的重载?
  • 不,没有过载。是Task&lt;File&gt; Add(string name, byte[] data);
  • 但是该方法所属的类是什么?它是来自已知的图书馆还是由您制作的?因为如果它是一个大文件,我会建议你从一个流复制到另一个流,这样你就不必将它加载到字节数组中的内存中。
  • 它是一些内部库(NuGet 包)。是的,我可以添加重载来使用流。我应该在哪里处理它?

标签: c# asp.net-core garbage-collection asp.net-core-webapi dispose


【解决方案1】:

对于大文件,我建议你将传入流复制到传出流中,以避免将所有文件保存在字节数组内的内存中。

假设您在fileStorage 中有一个支持流的方法,您可以在调用Add 方法后释放它。正如您在下面的示例中看到的:

 using(var incomingStream = file.OpenReadStream())
 {
     var firmware = await _firmwareManager.Add(
        new FirmwareAddDto
        {
            Name = file?.FileName,
            Version = version,
            Data = incomingStream 
        });
     (...)
  }

然后在管理器中,可以用流调用方法:

var blob = await _fileStorage.Add("filename", firmwareAddDto.Data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 2017-01-24
    • 2017-08-19
    • 2020-03-02
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多