锂PHP GridFS图像读取失败

时间:2013-05-23 19:44:34

标签: php mongodb gridfs lithium

在尝试使用1.3.4驱动程序和Lithium PHP framework从MongoDB GridFS集合中获取图像时,我的图像已损坏。我很难确定何时开始发生这种情况,因为虽然有问题的网站尚未生效,但我并没有在每次更改后对整个网站进行抽烟测试,而且我的测试用例都没有失败(我认为有人更擅长创建PHP测试用例比我可能告诉我如何在阅读之后为此创建一个测试用例)。

图像实际上是在不久前正确渲染的。我正在使用MongoHQ,一个基于云的数据库,mongodb版本2.4.1。

当我在通过网络应用程序获取的图像上执行wget十六进制转储时,我得到以下内容。

0000000 0a ff d8 ff e1 0f fe 45 78 69 66 00 00 4d 4d 00
0000010 2a 00 00 00 08 00 0a 01 0f 00 02 00 00 00 06 00
0000020 00 00 86 01 10 00 02 00 00 00 0a 00 00 00 8c 01
0000030 12 00 03 00 00 00 01 00 08 00 00 01 1a 00 05 00
0000040 00 00 01 00 00 00 96 01 1b 00 05 00 00 00 01 00
0000050 00 00 9e 01 28 00 03 00 00 00 01 00 02 00 00 01
0000060 31 00 02 00 00 00 06 00 00 00 a6 01 32 00 02 00
0000070 00 00 14 00 00 00 ac 02 13 00 03 00 00 00 01 00
0000080 01 00 00 87 69 00 04 00 00 00 01 00 00 00 c0 00
0000090 00 00 00 41 70 70 6c 65 00 69 50 68 6f 6e 65 20

但是当我在静态文件上执行wget(不是从数据库中获取)时,我得到了这个:

0000000 ff d8 ff e1 0f fe 45 78 69 66 00 00 4d 4d 00 2a
0000010 00 00 00 08 00 0a 01 0f 00 02 00 00 00 06 00 00
0000020 00 86 01 10 00 02 00 00 00 0a 00 00 00 8c 01 12
0000030 00 03 00 00 00 01 00 08 00 00 01 1a 00 05 00 00
0000040 00 01 00 00 00 96 01 1b 00 05 00 00 00 01 00 00
0000050 00 9e 01 28 00 03 00 00 00 01 00 02 00 00 01 31
0000060 00 02 00 00 00 06 00 00 00 a6 01 32 00 02 00 00
0000070 00 14 00 00 00 ac 02 13 00 03 00 00 00 01 00 01
0000080 00 00 87 69 00 04 00 00 00 01 00 00 00 c0 00 00
0000090 00 00 41 70 70 6c 65 00 69 50 68 6f 6e 65 20 34

差异是一开始是领先的“0a”,最后是“34”。

我正在获取相关的fs.files数据。例如:

{
  _id: ObjectId("519e31d39bdd497903000007"),
  tags: [
    "mancave"
  ],
  location: [],
  title: "Test Live Site",
  description: "This is for testing the live site",
  credit: "Test",
  user_name: "chuckwh",
  filename: "dog.jpg",
  uploadDate: ISODate("2013-05-23T15:12:19.000Z"),
  length: 86486,
  chunkSize: 262144,
  md5: "88d87a79a98106502777d06a4c7db329"
}

而且,显然,十六进制转储表明我基本上也得到了图像,它只是看起来我得到了它的损坏版本。我的堆栈跟踪中没有任何迹象表明存在问题。

我注意到Lithium人员为他们的Mongo数据库添加了一个补丁以更好地处理前缀但是我没有做任何棘手的事情,无论如何,只是检索fs.files,没有潜在的命名空间问题。

由于它之前有效,我怀疑是一个PHP驱动程序问题,但我没有看到任何已知的问题通过Google或此处进行讨论。有谁知道涉及mongodb版本2.4.1。,GridFS和1.3.4驱动程序的任何php驱动程序问题?

就代码而言,我几乎就像在这里完成的那样:

https://github.com/nateabele/photoblog/blob/master/controllers/PhotosController.php

该链接中的控制器引用的模型包含一个或两个不带核心锂包的锂库,如行为,但我再次强调这一点直到最近才有效。该网站的这一部分非常好地与网站的其他部分隔离。我做的唯一路由更改是添加一些分页,但我评论说,但仍然得到错误。我希望这个问题“结构良好”。我想我正在寻找的是,而不是一个特定的解决方案,我应该看到的一些指示,因为到目前为止,我显然没有找到正确的地方。感谢

1 个答案:

答案 0 :(得分:0)

自1.3.4以来,GridFS组件没有任何重大变化(参见:changelog)。需要调查的一件事是直接从fs.chunks读取数据。

由于您上面共享的fs.files文档的整个图像只有86486字节而块大小为262144,因此我们可以预期它将完全包含在第一个块中。搜索fs.chunks字段为files_id的{​​{1}}集合应该会显示单个文档。有关该集合架构的其他详细信息,请参见here

需要注意的一点是,MD5哈希是在最初存储文件时由服务器计算的。因此,上面文档中的哈希值应该与块的ObjectId("519e31d39bdd497903000007")字段的哈希值相匹配。如果这些值不同,则可能在事后修改了集合。内存/网络损坏也可能起作用。在PHP驱动程序中读取文件的逻辑只是简单地连接data上的查询中的字段,因此不太可能存在一个尚未被测试套件捕获的未完成的错误。