3

有没有办法从数据库中的 BLOB 类型字段中仅读取几个字节(对于这个问题,DB 品牌无关紧要)并确定二进制内容是否是图像(假设它是以下之一:JPG, GIF,PNG)?我有一个将文件存储在数据库中的 web 应用程序,如果它是图像,我想显示一个缩略图,否则我想显示一个图标......但我没有任何 MIMETYPE 信息存储在 blob 的其他任何地方(这不是我的设计)......因为它是一个 web 应用程序,所以图像的加载需要在单独的调用(getImage.ashx)中发生,而不是写出 <img> 标签......当我写出我不想将整个 blob 读入库中的标签,确定它是否是图像,调整它的大小......等等......我' 希望能够查看前几个字节并知道我是否需要编写标签。我不太了解图像文件结构/格式,无法知道在前几个字节中是否有某种标准标头,我可以读入以判断它是 JPG、GIF 还是 PNG。

有道理?

如果您想专门帮助我(而不是一般地回答是否可以完成),那么我正在使用 .NET C# 和 SQL 2005

谢谢!

4

3 回答 3

4

PNG开头为: 89 50 4E 47 0D 0A 1A 0A ;见http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html

GIF 以 47 49 46 38 37 61 (GIF87a) 或 47 49 46 38 39 61 (GIF89a) 开头;见http://www.fileformat.info/format/gif/egff.htm

JPEG 以 FF D8 FF E0 xx xx 4A 46 49 46 00 开头(编辑:添加标题的缺失部分;xx xx 是标题长度,以字节为单位);见http://www.obrador.com/essentialjpeg/headerinfo.htm

参考:http ://wangrui.wordpress.com/2007/06/19/file-signatures-table/

于 2009-08-11T15:33:50.580 回答
1
  • JPEG文件以FF D8 FF
  • GIFGIF89a以( 47 49 46 38 39)开头的文件
于 2009-08-11T15:31:12.237 回答
1

这将其带回了旧学校(用于数据访问策略)。无论如何,您可以使用 DataReader 来获取字段并流式传输结果,然后只需查看前 8 个字节即可查看您正在处理的图像类型。

有关如何将流读取器附加到数据读取器的介绍,请参阅本文。

综上所述,除非图像非常庞大,否则我可能只会获取所有字节,主要是因为第二次进入井中时,您从检查标题中获得的任何速度都可能会丢失。

另一种策略可能是创建一个视图来检查字段并根据 SQL 中的第一个标头字节公开类型。有点丑,但在紧要关头工作。

于 2009-08-11T15:36:44.520 回答