【问题标题】:Partial data missing from an image file retrieved from MSSQL DB从 MSSQL DB 检索的图像文件中缺少部分数据
【发布时间】:2012-04-27 11:54:26
【问题描述】:

我正在尝试显示保存在 Image 字段中的 DB 中的图像。但我只能看到 63KB 的图像。

这是我的代码:

$sql='SELECT Photo FROM Personel WHERE ID_USER = '.$id;

$result=mssql_query($sql);

$res=mssql_fetch_assoc($result);

header('Content-type:image/jpeg');
echo$res['Photo']; 

你看不出有什么特别之处,所以我认为数据库或服务器配置有问题。

数据库安装在 Windows XP 服务器上。

其实是Access control systems DB,以及安装在那个程序文件夹下的SQL文件,但不知道这些信息有用与否。

有什么想法吗?

更新 照片字段类型的屏幕截图:

【问题讨论】:

  • 您是如何将图像上传到数据库的?

标签: php sql-server image


【解决方案1】:

遇到同样的问题,先运行一下:

mssql_query('SET TEXTSIZE 10000000'); // sets limit to 10MB

【讨论】:

  • 完美运行。谢谢。看起来默认 TEXTSIZE 设置为 63kB (64512B)。
【解决方案2】:

很可能您正在为Photo 字段使用的数据类型(例如blob)对于您要保存的图像的大小来说过于严格。每种数据类型对该字段可存储的数据量都有不同的限制。

有关一些不同字段类型及其相关存储容量/适用性的示例,请参阅 this page in the MySQL documentation。

例如,blob 类型的限制为 2^16 字节 (64K)。

如果您的图片大于此值(很有可能),请尝试将字段类型更改为 mediumblob (2^24 = 16.78MB)。

如果您要处理真正大图像,那么您可能需要longblob (2^32 = 4.29 GB),但在那个阶段,您将拥有的不仅仅是数据存储问题:)

【讨论】:

  • 字段有 Image 格式,见截图(问题已更新)。
  • 很好的答案,谢谢。我认为我们的方向是正确的。但是有一个问题。我可以从该访问控制系统的默认程序中看到正确大小的图像。就是说db里的图片正常保存了吧?
  • 感谢截图。我可以看到它显示“16”。我不确定那是 16 字节、K 还是 MB……
  • @Squig 你说的是 MySQL,但 OP 使用的是 SQL Server。
  • 是的。老实说,直到我发布了我的示例之后我才发现这一点,我可能应该更彻底。我的主要目的是检查在数据库中存储值时 OP 是否了解不同的数据类型。 (63K 听起来如此接近 blob 字段的 64K 限制。)很明显,他们了解字段类型,并且从他们的 cmets 看来,无论如何这与 DB 无关。鉴于 DB 路线是一条红鲱鱼,我认为不值得我更新我的帖子,但如果您认为这会有所帮助,我很乐意用谷歌搜索并将我的链接替换为 MSSQL 的链接。
【解决方案3】:

检查您是否对字段 Photo 有限制。

【讨论】:

  • 我只在描述中找到Size -16,但没有找到如何更改它。查看屏幕截图(问题已更新)
  • 据我所知,这个 DataType 只包含一个指向文件的指针,所以增加它的大小(如果可能的话)对你没有帮助。尝试将您的 DataType 从 Image 更改为 varbinary(max)。
  • 有趣...它可以提供帮助,谢谢。稍后我会尝试,害怕破坏实时数据库:)
【解决方案4】:

鉴于您的 cmets 说整个图像 存储在数据库中,问题可能与 PHP 中的数据限制/超时和/或网络服务器。

编辑:我在此处留下了答案的以下部分以获取历史信息(以显示我们还尝试了什么),但请参阅下面的 cmets,因为该问题更有可能与 PHP 或网络服务器配置设置有关,限制响应数据的大小。还没有完全解决。


我注意到您有一个 Content-type 标头,但没有 Content-length 标头。

您可以尝试添加带有任意已知值(例如 12288)的 Content-length 标头,看看这是否会影响返回文件的大小(因为您知道它当前是 63K - 它会更改为 12K 吗?)

如果是这样,那么您需要让 PHP 计算/找出图像的实际大小并添加该长度的 Content-length 标头。

【讨论】:

  • 没想到。我试过了。如果我使用小于 63K 的大小,则显示的信息更少,但如果我写的大小超过 63K,则与没有内容长度的情况相同。
  • 好的。在这种情况下,是时候查看 PHP 和/或 webserver 文档以了解默认/最大内容长度设置/脚本执行时间等。我查看了我的 php.ini 并看不到任何明显的东西。您正在运行哪个网络服务器?
  • 可能是 apach,我无权访问它。但我会要求我们的系统管理员查看配置。非常感谢您的帮助。我在设置 mssql.textlimit = 4096 中找到,在互联网上查看它可以提供帮助。你怎么看?
  • 该设置听起来仍然像数据库设置,并且 4096 与 63KB 不匹配,所以我认为不会是这样。无论如何尝试改变它,看看它是否有帮助,但如果它有帮助,我会感到惊讶。如果您的站点位于公开可用的服务器上,请尝试访问 centralops.net/co/DomainDossier.aspx,输入您的站点域并选中“服务扫描”框。你可能会得到一些关于哪个网络服务器正在运行的信息。
  • 我认为这些信息足以让我们的系统管理员找到解决方案。所有这些变体之一都可以使用:) 再次感谢您,我将其标记为正确答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
相关资源
最近更新 更多