从字节返回FileResult []

时间:2019-05-11 18:27:55

标签: c# asp.net-core

我正在研究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 个答案:

答案 0 :(得分:3)

可能byte[]数据包含图像本身,而不是图像文件的路径。否则Data只会是一个字符串。您可以使用

将其转换为Image对象
Image image;
using (var ms = new MemoryStream(imageBytes))
{
    image = Image.FromStream(ms);
}

答案 1 :(得分:3)

这似乎是XY problem。您正在混淆控制器帮助器方法,并尝试从不相关的服务中访问它们。

我建议您重构服务以返回字节数组

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");
}

答案 2 :(得分:0)

您可以使用类似的东西

return new FileStreamResult(new MemoryStream(MyArtistImage.Data ...