我有两个相同的图像。一个在文件夹中保存为.png,另一个在数据库中保存为SQLite blob。我正在试图找出一种很好的方法来保存这些图像并在需要时在我的视图中显示它们。
我有两种尝试将这些图像放入视图的方法。第一个是直接从文件系统读取图像文件,将它们转换为base64字符串,我将其转换为ViewBag。这种方法很好。
另一种方法是尝试直接从数据库加载图像blob,然后从视图中的模型中获取图像。这不是很好。
通过几个断点,我发现base64字符串之间存在巨大差异,具体取决于我的方法。我不确定为什么以及我的文件系统中的SQLite图像blob和.png之间的区别是什么,并且任何帮助都会受到赞赏,因为在文件夹中保存图像似乎是额外的工作,当我可以将它们保存在我的文件夹中时数据库中。
从文件系统加载:
public string FirstImagePath(string slideid, int well)
{
var firstPath = HttpContext.Current.Server.MapPath(slideid);
byte[] firstImageByteData = File.ReadAllBytes(firstPath + "_first" + well + ".png");
string firstImageBase64Data = Convert.ToBase64String(firstImageByteData);
string firstImageDataUrl = string.Format("data:image/png;base64,{0}", firstImageBase64Data);
return firstImageDataUrl;
}
从SQLite db加载:
public byte[] FirstImage { get; set; }
public string FirstBase64Image
{
get { return ConvertImage(FirstImage);}
}
public string ConvertImage(byte[] imageBytes)
{
byte[] imageArray = imageBytes;
string imageBase64String = Convert.ToBase64String(imageBytes);
string imageDataString = string.Format("data:image/png;base64,{0}", imageBase64String);
return imageDataString;
}
答案 0 :(得分:1)
这两种方法都有其优点和缺点。 如果将图像存储在数据库中,则可以非常轻松地跨不同平台移动应用程序,而无需复制大量图像。另一方面,随着时间的推移,你的数据库会变得非常大。 将图像存储在磁盘上允许您使用复制/粘贴作业等轻松覆盖它们。但是,如果您有多个Web服务器,则必须多次进行此更改。 但是,这不是我的方法的主要问题。问题是你获得图像,将它们转换为base64并将它们嵌入到输出中。出于多种原因,这是不好的做法。首先,浏览器足够智能,可以一次加载多个资源。例如,您的浏览器可以一次下载多个图像,这将大大提高页面加载速度。如果嵌入了图像,则html解析器负责渲染这些图像,这反过来会降低html文档的整体下载速度,因为它更大。
我会推荐两者的混合体。将图像上传到您的数据库。在应用程序中创建一个图像处理程序,用于从数据库中检索图像并尝试将其保存到文件系统。如果成功返回此图像。下次当您尝试获取此图像(并且它未在用户计算机上缓存)时,您的处理程序可以检查文件系统以查看它是否已经创建并返回它。 此方法为您提供了DB和文件结构方法的优点。如果您确定需要10个Web服务器,则所有图像都将存储在数据库中,并且根据哪个服务器收到请求,文件系统将根据您的需要自动填充图像。我建议您为图片使用GUID或一些唯一ID。
您甚至可以进一步扩展它并将高度和宽度参数传递给图像处理程序,该图像处理程序会在将图像发送回客户端之前为您调整图像大小。