16

私のクライアントでは、いくつかのさまざまなファイルにBLOBストレージを使用する必要があります。

そこで、BlobクラスがDoctrine \ DBAL \ Types\Typeを拡張する独立したバンドルを作成しました。バンドルクラスのブート関数を使用します。

これはかなりうまく機能し、データベースのBlobデータに書き込むことができます。

しかし、:/以降はドキュメントをダウンロードできません

私は持っています:

public function downloadAction($id) {
    $em = $this->getDoctrine()->getManager();

    /* @var $entity Document */
    $entity = $em->getRepository('Lille3SapBundle:Document')->find($id);

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Document entity.');
    }

    $file = $entity->getFichier();

    $response = new \Symfony\Component\HttpFoundation\Response($file, 200, array(
        'Content-Type' => 'application/octet-stream',
        'Content-Length' => sizeof($file),
        'Content-Disposition' => 'attachment; filename="'.$entity->getNomDocument().'"',
    ));

    return $response;
}

例外があります。応答コンテンツは、指定された__toString()、"resource"を実装する文字列またはオブジェクトである必要があります。

実際、$ file値は予期されるBLOBではなく、リソースID#123のようなものです。

-> BLOBデータフィールドの値を確認しましたが、データベースで問題ありません

では、どうすればコントローラーにリソースID#111ではなくblob行を強制することができますか?

4

2 に答える 2

1

さて、私は(非常に醜い)解決策を持っています:

まず、ドキュメント エンティティのファイル属性のデータ型blobテキストに変更しました。

次に、createAction で setFichier 呼び出しを変更しました。

$stream = fopen($entity->getFichier(),'rb');
$entity->setFichier(base64_encode(stream_get_contents($stream)));

3 番目: downloadAction で、テキスト base64 テキスト フィールドをデコードします。

$file = $entity->getFichier();              
$response = new \Symfony\Component\HttpFoundation\Response(base64_decode($file), 200, array(
        'Content-Type' => 'application/octet-stream',
        'Content-Length' => sizeof($file),
        'Content-Disposition' => 'attachment; filename="'.$entity->getNomDocument().'"',
));

return $response;

そして今、私はblobの方法でファイルを保持してダウンロードすることができます...

于 2013-03-05T10:03:57.407 に答える