Загрузите большой файл в API и сохраните его - PullRequest
0 голосов
/ 03 октября 2019

У меня есть простой веб-контроллер 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);
}

, затем в диспетчере у меня есть этот код, который хранит поток в хранилище BLOB-объектов Azure

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

Должен ли я что-то здесь расположить? Я собираюсь загрузить большие файлы. Посоветуйте, пожалуйста, правильно ли вы утилизируете

1 Ответ

2 голосов
/ 04 октября 2019

Для больших файлов я советую вам скопировать входящий поток в исходящий поток, чтобы избежать необходимости хранить весь файл в памяти внутри байтового массива.

Предполагая, что у вас есть метод в 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);
...