Symfony2的强制JPG下载返回损坏的文件(Symfony2 forcing jpg downl

2019-10-29 12:10发布

以下一些有关我终于与此版本的“强制下载”码上来主题的很多帖子的:

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图像查看器,从而结束报告文件损坏错误。

在另一方面,相同的下载JPG完全打开,在Adobe Photoshop(不太严格吧?)

想法? 任何人?

提前致谢。

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

UPDATE2:OK,我知道现在是一个BOM问题。 现在,我怎样才能摆脱讨厌的“EF BB BF”从file_get_content结果?

Answer 1:

请尝试以下的建议在这里

// 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-加速读取这里 。 和使用

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',
 // ...


文章来源: Symfony2 forcing jpg download returns corrupted file