0

この件に関連する多くの投稿のいくつかに従って、最終的にこのバージョンの「強制ダウンロード」コードを思いつきました。

public function downloadAction(Request $request){

    $filename= 'test.jpg';
    $response = new Response();

    $response->headers->set('Content-Type','image/jpg');
    $response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '"');        

    $response->sendHeaders();
    $response->setContent(file_get_contents($filename)); 

    return $response;
} 

現在、これは zip ファイルでは正常に機能しますが (明らかに正しいコンテンツ タイプを使用しています)、jpg の場合は別のことが起こります。HexCompare を使用して元の JPG とダウンロードした JPG の両方をチェックすると、ダウンロードしたバージョンではファイルの先頭に「EF BB BF」が追加されていることがわかりました。これは、破損したファイル エラーを報告する Windows イメージ ビューアーには十分なようです。

一方、ダウンロードした同じ jpg は、Adobe Photoshop で完全に開きます (あまり厳密ではないのでしょうか?)。

アイデア?誰でも?

前もって感謝します。

Z

更新: このコードを使用してダウンロードした Zip ファイルは、WinRAR または WinZIP でのみ開くことができます。Windows エクスプローラーの Zip 抽出では、破損したファイル エラー メッセージが表示されます。

UPDATE2: OK、BOM の問題であることはわかっています。では、file_get_content の結果から厄介な「EF BB BF」を取り除くにはどうすればよいでしょうか。

4

1 に答える 1

0

ここで提案されているように、次のことを試してください

// Set headers
$response->headers->set('Cache-Control', 'private');
$response->headers->set('Content-type', mime_content_type($filename));
$response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '"');
$response->headers->set('Content-length', filesize($filename));

// Send headers before outputting anything
$response->sendHeaders();
$response->setContent(readfile($filename));

mod_xsendfile で apache を使用している場合は、次を試してください。

return new Response('', 200, array(
    'X-Sendfile'          => $filename,
    'Content-type'        => 'application/octect-stream',
    'Content-Disposition' => sprintf('attachment; filename="%s"', $filename)),
     // ...
));    

nginx の X-Accel を使用している場合は、こちらをお読みください。と使用

return new Response('', 200, array(
    'X-Accel-Redirect'    => $filename,
    'Content-type'        => 'application/octect-stream',
    'Content-Disposition' => sprintf('attachment; filename="%s"', $filename)),
    // ...
));    

nginx でより多くの制御を得るには、追加の利用可能なオプションがあります...

// ...
'X-Accel-Limit-Rate' => '1024',
'X-Accel-Buffering'  => 'yes',  // yes|no
'X-Accel-Charset'    => 'utf-8',
 // ...
于 2013-05-23T16:52:24.117 に答える