Вернуть FileResult из байта [] - PullRequest
0 голосов
/ 11 мая 2019

Я работаю над ASP.NET Core API.API управляется базой данных.

Я храню изображения в базе данных, моя сущность ArtistImage.cs выглядит следующим образом:

ArtistImage.cs

public class ArtistImage
{
    public int Id { get; set; }

    public byte[] Data { get; set; }

    public DateTime CreatedAt { get; set; }

    public DateTime? ModifiedAt { get; set; }

    public int ArtistId { get; set; }

    public Artist Artist { get; set; }
}

Как я могу преобразовать byte[] во что-то вроде: return File("~/Images/photo.jpg", "image/jpeg");, где это просто послужило бы изображению?

Я хочу избежать записи массива байтов в локальный системный файл первым.

Что я пробовал

Я попробовал описанный ниже метод, но, видимо, я не могу использовать File таким образом.

public class ImagesService : IImagesService 
{
    private readonly DbContext context;

    public ImagesService(DbContext context)
    {
        this.context = context;
    }

    public async Task<FileResult> GetArtistImageAsync(int imageId)
    {
      byte[] imageBytes = await context
        .ArtistImages
        .Where(ai => ai.Id == imageId)
        .Select(ai => ai.Data)
        .SingleOrDefaultAsync();

      return System.IO.File(imageBytes, "image/jpg", "test");
    }
}

what I have tried

Ответы [ 3 ]

3 голосов
/ 11 мая 2019

Вероятно, данные byte[] содержат само изображение, а не путь к файлу изображения.В противном случае Data будет просто строкой.Вы можете преобразовать это в Image объект с

Image image;
using (var ms = new MemoryStream(imageBytes))
{
    image = Image.FromStream(ms);
}
3 голосов
/ 11 мая 2019

Это, похоже, проблема XY . Вы смешиваете вспомогательные методы контроллера и пытаетесь получить к ним доступ из несвязанного сервиса.

Я бы предложил вам реорганизовать сервис, чтобы он возвращал байтовый массив

ImagesService

public Task<byte[]> GetArtistImageAsync(int imageId) {
    return context.ArtistImages
            .Where(ai => ai.Id == imageId)
            .Select(ai => ai.Data)
            .SingleOrDefaultAsync();
}

и затем контроллер возвращает FileResult

Контроллер

public async Task<IActionResult> SomeAction(....) {
    //...

    var bytes = await imagesService.GetArtistImageAsync(imageId);
    return File(bytes,  "image/jpeg");
}
0 голосов
/ 11 мая 2019

Вы можете использовать что-то подобное

return new FileStreamResult(new MemoryStream(MyArtistImage.Data ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...