我正在开发一个ASP.NET核心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");
}
}

发布于 2019-05-11 18:48:46
这似乎是一个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");
}发布于 2019-05-11 18:43:45
byte[]数据可能包含图像本身,而不是图像文件的路径。否则,Data将只是一个字符串。可以将其转换为Image对象。
Image image;
using (var ms = new MemoryStream(imageBytes))
{
image = Image.FromStream(ms);
}发布于 2019-05-11 18:34:46
你可以用这样的方法
return new FileStreamResult(new MemoryStream(MyArtistImage.Data ...https://stackoverflow.com/questions/56093166
复制相似问题