使用实体框架6从SQL Server中保存和检索图像(二进制)

本文关键字:检索 保存 图像 二进制 Server 实体 框架 SQL | 更新日期: 2023-09-27 18:18:44

我正在尝试将位图图像保存到数据库

Bitmap map = new Bitmap(pictureBoxMetroMap.Size.Width, pictureBoxMetroMap.Size.Height);

我在数据类型binary的数据库中创建了一个列imgcontent,但我的问题是如何将这个bitmap(映射)转换为二进制数据?

如何从数据库中检索数据?

我用谷歌搜索了一下,发现了类似这样的东西,但它不起作用:

byte[] arr;
ImageConverter converter = new ImageConverter();
arr = (byte[])converter.ConvertTo(map, typeof(byte[]));

使用实体框架6从SQL Server中保存和检索图像(二进制)

将图像转换为byte[]并将其存储在数据库中


将这个列添加到你的模型中:

public byte[] Content { get; set; }

然后将图像转换为字节数组并像存储其他数据一样存储:

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
    using(var ms = new MemoryStream())
    {
        imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    
        return ms.ToArray();
    }
}
public Image ByteArrayToImage(byte[] byteArrayIn)
{
     using(var ms = new MemoryStream(byteArrayIn))
     {
         var returnImage = Image.FromStream(ms);
         return returnImage;
     }
}

来源:最快的方式转换图像到字节数组

var image = new ImageEntity()
{
   Content = ImageToByteArray(image)
};
_context.Images.Add(image);
_context.SaveChanges();

当你想要得到图像回来,从数据库中获取字节数组,并使用ByteArrayToImageImage做你想做的

byte[]变大时,这个停止工作。

我建议使用这个扩展库,如果你想清洁和有效地使用内存的大文件。该库将文件存储在较小的块中

https://www.nuget.org/packages/Files.EntityFrameworkCore.Extensions

如果支持文件创建,删除&。

public class UserImage : IFileEntity
{
    public Guid Id { get; set; }
    public Guid FileId { get; set; }
    public string Name { get; set; }
    public string MimeType { get; set; }
    public DateTimeOffset TimeStamp { get; set; }
    public Guid? NextId { get; set; }
    public int ChunkBytesLength { get; set; }
    public long TotalBytesLength { get; set; }
    public byte[] Data { get; set; }
}
//Save file chunks from stream to database, you can also save from filePath
var fileDetails = await _context.SaveFileAsync<UserImage>(file.OpenReadStream(), file.FileName, file.ContentType);
//Create Stream and download file chunks from database into this stream.
var stream = new MemoryStream();
await _context.DownloadFileToStreamAsync<UserImage>(id, stream);