【问题标题】:Why are GridFS file name and bytes null?为什么 GridFS 文件名和字节为空?
【发布时间】:2012-08-20 03:27:42
【问题描述】:

我已使用以下方法成功地将文件添加到 GRIDFS:

 $asset = new Asset();
   $asset->setName('Image'.$count);
   $asset->setFile($uploadedFile->getPathname());
   $dm->persist($asset);
   $dm->flush();

然后我尝试使用以下方法打印文件:

$dm = $this->get('doctrine.odm.mongodb.document_manager');
         $image = $dm->createQueryBuilder('MyBundle:Asset')
                     ->field('id')->equals($imageID)
                     ->getQuery()
                     ->getSingleResult();
                 header('Content-type: image/png;');
                  echo $image->getFile()->getBytes();

但是什么都没有出现。所以我这样做:

var_dump($image);

并得到以下信息:

object(Main\MyBundle\Document\Asset)#429 (7) {
  ["id":protected]=>
  string(24) "50330286c7e24c7019000004"
  ["name":protected]=>
  string(6) "Image2"
  ["file":protected]=>
  object(Doctrine\MongoDB\GridFSFile)#427 (4) {
    ["mongoGridFSFile":"Doctrine\MongoDB\GridFSFile":private]=>
    object(MongoGridFSFile)#430 (3) {
      ["file"]=>
      array(7) {
        ["_id"]=>
        object(MongoId)#431 (1) {
          ["$id"]=>
          string(24) "50330286c7e24c7019000004"
        }
        ["name"]=>
        string(6) "Image2"
        ["filename"]=>
        string(14) "/tmp/phpQ1LCIC"
        ["uploadDate"]=>
        object(MongoDate)#432 (2) {
          ["sec"]=>
          int(1345520262)
          ["usec"]=>
          int(510000)
        }
        ["length"]=>
        float(194992)
        ["chunkSize"]=>
        float(262144)
        ["md5"]=>
        string(32) "5bbc9ede74f50f93a3f7d1f7babe3170"
      }
      ["gridfs":protected]=>
      object(MongoGridFS)#437 (5) {
        ["w"]=>
        int(1)
        ["wtimeout"]=>
        int(10000)
        ["chunks"]=>
        object(MongoCollection)#438 (2) {
          ["w"]=>
          int(1)
          ["wtimeout"]=>
          int(10000)
        }
        ["filesName":protected]=>
        string(12) "assets.files"
        ["chunksName":protected]=>
        string(13) "assets.chunks"
      }
      ["flags"]=>
      int(0)
    }
    ["filename":"Doctrine\MongoDB\GridFSFile":private]=>
    NULL
    ["bytes":"Doctrine\MongoDB\GridFSFile":private]=>
    NULL
    ["isDirty":"Doctrine\MongoDB\GridFSFile":private]=>
    bool(false)
  }
  ["uploadDate":protected]=>
  string(21) "0.51000000 1345520262"
  ["length":protected]=>
  string(6) "194992"
  ["chunkSize":protected]=>
  string(6) "262144"
  ["md5":protected]=>
  string(32) "5bbc9ede74f50f93a3f7d1f7babe3170"
}

为什么文件名和字节为 NULL?

【问题讨论】:

    标签: php mongodb symfony gridfs


    【解决方案1】:

    如果您查看GridFSFile 源代码,您会发现$bytes 仅在覆盖文件内容时使用。 $filename 属性有时会在 getter 期间设置,但在更改 GridFS 中的文件名时会另外使用。

    根据您的 var_dump() 输出中的其他值,看起来 GridFS 中肯定有一个文件(它具有块大小、字节长度、md5 哈希等)。我建议调试 GridFSFile::getBytes() 方法并确保它正确链接到内部 MongoGridFSFile 实例上的 getBytes() 方法。或者,您可以尝试调用GridFSFile::getMongoGridFSFile() 并直接使用原始驱动程序类。这会将其范围缩小到 Doctrine 或驱动程序问题。

    顺便问一下,您使用的是什么版本的 PECL 驱动程序? GridFS 过去有过一些错误,最近的版本也有一些更新(参见:changelog)。

    【讨论】:

    • Web 服务器 Web 服务器 Apache/2.2.22 PHP 版本 PHP 5.3.15 PHP 扩展 mongo/1.2.12
    • 我已经调试了 bth 的代码,包括 GridFSFile::getMongoGridFSFile() 并且我确实有一个字节大小,但是当涉及到 getBytes 时,我无法取回任何东西。这非常令人困惑。
    • 您是否尝试过单独的 CLI 脚本直接连接到 Mongo 并将 MongoGridFS::get() 与 ObjectId 一起使用?
    猜你喜欢
    • 2013-09-02
    • 2012-11-26
    • 2021-11-02
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2021-08-22
    相关资源
    最近更新 更多