使用实体框架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[]));
将图像转换为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();
当你想要得到图像回来,从数据库中获取字节数组,并使用ByteArrayToImage
和Image
做你想做的
当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);