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 时,我发现下载的版本在文件开头添加了“EF BB BF”。这对于 Windows Image Viewer 来说似乎已经足够了,它会报告损坏的文件错误。

另一方面,同样下载的 jpg 在 Adob​​e Photoshop 中完美打开(也许不那么严格?)

想法?任何人?

提前致谢。

Z

更新:使用此代码下载的 Zip 文件只能使用 WinRAR 或 WinZIP 打开,Windows 资源管理器 Zip 提取显示损坏文件错误消息。

UPDATE2:好的,我现在知道是 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));

如果您将 apache 与 mod_xsendfile 一起使用,请尝试:

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 回答