【问题标题】:Return a FileResult from a byte[]从 byte[] 返回 FileResult
【发布时间】:2019-09-29 06:45:54
【问题描述】:

我正在开发一个 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");
    }
}

【问题讨论】:

  • 也许你的方法返回Task&lt;IActionResult&gt;

标签: c# asp.net-core


【解决方案1】:

你可以使用类似的东西

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我想你可能误解了 OP 相关的上下文。
    【解决方案3】:

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

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

    图像服务

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

    【讨论】:

    • File 似乎是这里的一个方法,而不是来自 System.IO 命名空间的静态类。它来自哪里?
    • @OlivierJacot-Descombes 检查docs.microsoft.com/en-us/dotnet/api/…
    • @OlivierJacot-Descombes File 在这种情况下是 ControllerBase 上的一个方法。
    • 很高兴知道。这也不清楚,因为 OP 在class ImageService : IImageService 中使用它,它不是从ControllerBase 派生的,而且他引用了System.IO.File。但这可能是他的问题的一部分。
    • @OlivierJacot-Descombes 这就是问题所在。他们试图从服务中调用控制器方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 2018-03-25
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多