I have stored some images in Mongo DB GridFS. I am now trying to display the image but am running into serious challenges. All I see is <Mongo Binary Data>
as the out put. I have played around with setting headers but nothing seems to be working fine. All I see is <Mongo Binary Data>
. I try sending an image header (jpeg/png etc) but the image comes out empty. Why ?
Here is my code that displays the image:
public function someAction($imageID)
{
$dm = $this->get('doctrine.odm.mongodb.document_manager');
$image = $dm->createQueryBuilder('Mybundle:Asset')
->field('id')->equals($imageID)
->getQuery()
->getSingleResult();
return new Response($image->getFile()->getBytes(), 200, array('Content-Type' => 'image/jpeg'));
}
When I try changing the content type to text, I get <Mongo Binary Data>
again.
Here is my routing file:
my_route:
pattern: /showimage/{imageID}
defaults: { _controller: MyBundle:someController:someAction}
requirements:
_method: GET
"<Mongo Binary Data>"
is the string returned from MongoBinData::__toString(). This behavior goes back a number of years, but I assume it was implemented to avoid inadvertently generating large output or echoing non-printable characters if MongoBinData was ever cast to a string.
In your case, I assume $image->getFile()
corresponds to a Doctrine\MongoDB\GridFSFile
object. I would start debugging there to see if getBytes()
is returning the internal $bytes
property of the object, some file contents, or chaining to MongoGridFSFile::getBytes().
Additionally, sharing the model/mapping information for your Asset class could help, as well as the non-hydrated data returned by the same query. Adding ->hydrate(false)
to the query builder chain would accomplish the latter.