Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lili PHP GridFS图像读取失败_Php_Mongodb_Gridfs_Lithium - Fatal编程技术网

Lili PHP GridFS图像读取失败

Lili PHP GridFS图像读取失败,php,mongodb,gridfs,lithium,Php,Mongodb,Gridfs,Lithium,在尝试使用1.3.4驱动程序和从MongoDB GridFS集合中获取图像时,我得到了损坏的图像。我很难确定这是什么时候开始发生的,因为,尽管所讨论的站点还没有上线,但我没有在每次更改后对整个站点进行冒烟测试,而且我的测试用例没有一个失败(我认为比我更擅长创建php测试用例的人可能会在阅读本文后告诉我如何为此创建测试用例). 不久前,这些图像实际上是正确渲染的。我使用的是MongoHQ,一个基于云的数据库,mongodb版本2.4.1 当我对通过web应用程序获取的图像进行wget十六进制转储

在尝试使用1.3.4驱动程序和从MongoDB GridFS集合中获取图像时,我得到了损坏的图像。我很难确定这是什么时候开始发生的,因为,尽管所讨论的站点还没有上线,但我没有在每次更改后对整个站点进行冒烟测试,而且我的测试用例没有一个失败(我认为比我更擅长创建php测试用例的人可能会在阅读本文后告诉我如何为此创建测试用例).

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

当我对通过web应用程序获取的图像进行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"
}
而且,很明显,十六进制转储表明我基本上也得到了图像,只是看起来我得到了一个损坏的版本。我的堆栈跟踪中没有任何指示问题的内容

我注意到Limition的人在Mongo DB中添加了一个补丁,以更好地处理前缀,但无论如何,我没有做任何棘手的事情,只是检索fs.files,没有潜在的名称空间问题

由于它以前工作过,我怀疑php驱动程序有问题,但我没有看到任何已知的问题通过谷歌或在这里讨论。有人知道涉及mongodb 2.4.1版、GridFS和1.3.4版驱动程序的任何php驱动程序问题吗

就代码而言,我基本上是按照这里的方式进行的:


该链接中的控制器引用了一个模型,其中包含一两个核心锂电池包中没有的锂电池库,比如behaviors,但我再次强调,直到最近,它才起作用。该站点的这一部分与站点的其余部分有很好的隔离。我所做的唯一路由更改是添加了一些分页,但我对此进行了注释,仍然得到了错误。我希望这个问题是“结构合理的”。我想我要找的不是一个具体的解决方案,而是一些我应该找的地方的指针,因为到目前为止我显然没有找对地方。谢谢

自1.3.4版以来,GridFS组件没有任何重大更改(请参阅:)。要调查的一件事是直接从
fs.chunks
读取数据

由于您在上面共享的
fs.files
文档的整个图像只有86486字节,块大小为262144,因此我们可以预期它将完全包含在第一个块中。搜索
fs.chunks
集合,其中
files\u id
字段为
ObjectId(“519e31d39bdd4990300007”)
应显示单个文档。可以找到有关该集合架构的其他详细信息


需要注意的一点是,MD5散列是在文件最初存储时由服务器计算的。因此,上面文档中的哈希值应该与块的
数据
字段的哈希值匹配。如果这些值不同,则可能是在事件发生后对集合进行了修改。内存/网络损坏也可能起作用。在PHP驱动程序中读取文件的逻辑只是将来自
fs.chunks
上的查询的字段串联起来,因此不太可能存在测试套件尚未发现的未解决的bug。

那么用于读取图像的代码呢?你注意到了吗?谢谢,内特-是的,我使用了那条确切的路线-正如我提到的,直到最近,它一直工作得很好。我的mongo提供商同意我的观点,这可能是一个驱动程序问题。我还没有机会在IP上运行MongoShell,但我会尽快更新这篇文章。再次感谢。