C # .NET Web API Как лучше всего загружать и скачивать файлы? - PullRequest
1 голос
/ 26 апреля 2019

Я получил C # .NET Core Web API ( REST ). Я хочу реализовать конечную точку для загрузки файлов и одну для загрузки файлов (любой тип файла, как двоичный файл). Что такое лучшая практика для дизайна и кода? То, что я до сих пор нахожу поисковой системой, - это неделя. У вас есть рекомендации для меня? Я думаю, что я должен сохранить метаданные как заголовок (тип, ..?) Где-то еще. Может упростить поиск файлов.

По этой ссылке от microsoft Я получаю проблему, которая, кажется, только для MVC API, чем я не пользуюсь.

* После 1017 *

[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)

files пусто.

А это из c-sharpcorner не работает аккуратнее. Мой объектный файл типа IFormFile не знает метода. GetFilename().

enter image description here

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

В этом месте есть очень хорошая статья о том, как загружать / скачивать файлы, используя ядро ​​.net . Тот же учебник должен работать и для веб-API.

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

Для получения имени файла, определение IFormFile, как показано ниже:

public interface IFormFile
{
    string ContentType { get; }
    string ContentDisposition { get; }
    IHeaderDictionary Headers { get; }
    long Length { get; }
    string Name { get; }
    string FileName { get; }
    Stream OpenReadStream();
    void CopyTo(Stream target);
    Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}

Следовательно, вы должны иметь возможность использовать свойство FileName для получения имени файла.

2 голосов
/ 26 апреля 2019

Если вы посмотрите на IFormFile документы, вы заметите, что у него есть свойство FileName, которое вы можете использовать:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.iformfile?view=aspnetcore-2.2

Так, в качестве примера, вы можете взять это и сохранить его там, где вам нужно, с этим свойством. В моем случае все низкоуровневые элементы записи этого файла в хранилище скрыты в хранилище, но вы поняли:

public async Task<IActionResult> Upload(IFormFile file)
{
    if (file == null || file.Length == 0) return BadRequest();
    using (var ms = new MemoryStream())
    {
        file.CopyTo(ms);
        var img = new Entities.Image
        {
            Name = file.FileName,
            ContentType = file.ContentType,
            Data = ms.ToArray()

         };
         await _repo.CreateImage(img);
         return Ok();
    }
}
...