ByteArray to IFormFile - PullRequest
       0

ByteArray to IFormFile

0 голосов
/ 14 октября 2019

Я занимаюсь разработкой REST API с C # и Net Core
У меня есть функция в моем хранилище, которая принимает параметр типа IFormFile.

public async Task<bool> UploadFile(IFormFile file)
{
    // do some stuff and save the file to azure storage
}

Эта функция вызывается методом контроллера, который передает ему загруженный файл

public class FileController : Controller
{
    public async Task<IActionResult> UploadDoc(IFormFile file
    {
        // Call the repository function to save the file on azure
        var res = await documentRepository.UploadFile(file);
    }
}

Теперь у меня есть другая функция, которая вызывает внешний API, который возвращает файл в виде байтового массива. ,Я хотел бы сохранить этот байтовый массив, используя метод repository.UploadFile, но я не могу привести объект байтового массива к IFormFile.
Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

Ваш репо не должен использовать IFormFile. Это абстракция, которая применяется только к одному конкретному методу передачи файлов HTTP (а именно к телу запроса в кодировке multipart/form-data). Что-то вроде вашего репозитория не должно знать источника файла (HTTP) или как он был передан (multipart/form-data против application/json, например).

Вместо этого выследует использовать Stream для вашего параметра. В своем действии UploadDoc вы можете просто выполнить:

using (var stream = file.OpenReadStream())
{
    await documentRepository.UploadFile(stream);
}

И, где у вас есть только байтовый массив:

using (var stream = new MemoryStream(byteArray))
{
    await documentRepository.UploadFile(stream);
}

Вы также можете рассмотреть возможность добавления перегрузкиUploadFile, что занимает byte[], так как создание нового потока памяти из байтового массива просто для того, чтобы иметь поток, является пустой тратой ресурсов. Тем не менее, byte[] должен обрабатываться иначе, чем Stream, поэтому для этого может потребоваться некоторое дублирование логики. Вам нужно будет оценить компромиссы.

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

Вы можете преобразовать байтовый массив в MemoryStream:

var stream = new MemoryStream(byteArray);

.. и затем передать его конструктору из FromFileкласс:

IFormFile file = new FormFile(stream, 0, byteArray.Length, "name", "fileName");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...