3

Symfony 2.1 でファイルを提供することについて質問があります

public function exampleFileAction(){
    $response = new Response();

    $d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'File.xls');

    $response->setContent(file_get_contents('../uploads/Bundle/Files/File.xls'));
    $response->headers->set('Content-Disposition', $d);
    return $response;
}

上記のコードは正常に動作していますが、このようにする実際の方法はありますか? また、file_get_contents でファイルを取得してもよろしいでしょうか。

ありがとう

4

2 に答える 2

10

2013年3月編集

この応答は、大きなファイルには従うべきではありません。ゲームには新しいプレーヤーがあります: https://github.com/igorw/IgorwFileServeBundle

SendFile をサポートして、ファイルのダウンロードを Apache/Ngnix に委任します。これははるかに優れています。

編集2013年5月

すばらしいニュース: ビルドイン ソリューションがコアで利用できるようになりました: BinaryFileResponse


古い応答:

という名前の新しい Response クラスがありStreamedResponseます。これはまさにあなたがしようとしていることを実行しますが、よりメモリ効率が良く、カーネルによって適切に処理されます。

StreamedResponse は、ストリーミングされた HTTP 応答を表します。
StreamedResponse は、そのコンテンツにコールバックを使用します。
コールバックは、echo などの標準の PHP 関数を使用して、応答をクライアントにストリーミングする必要があります。必要に応じて、flush() メソッドも使用できます。

http://symfony.com/doc/master/components/http_foundation/introduction.html#streaming-a-response

したがって、大きなファイルの場合は、file_get_content なしで実行できます。

<?php
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

$response = new StreamedResponse();
$response->setCallback(function () {
    $name = 'bigfile.pdf';
    $fp = fopen($name, 'rb');
    fpassthru($fp);
});
$d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'foo.pdf');
$response->headers->set('Content-Disposition', $d);
$response->send();
于 2012-08-21T14:36:15.423 に答える
0

ダミアンのソリューションをコントローラーで機能させることができませんでした。

これが私が仕事をするようになったものです:

<?php
...
return new StreamedResponse(
  function () use ($file) {
    readfile($file);
  }, 200, array(
            'Content-Type' => 'image/png',
            'Content-Disposition' => 'inline; filename="filename.png"')
);

クレジット: http://ailoo.net/2013/03/stream-a-file-with-streamedresponse-in-symfony/

于 2013-04-09T04:00:13.733 に答える