Symfony2强制jpg下载返回损坏的文件

时间:2013-05-23 16:30:45

标签: symfony download jpeg byte-order-mark corrupt

根据与该主题相关的一些帖子,我终于想出了这个版本的"强制下载"代码:

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在Adobe Photoshop中完全打开(可能不那么严格?)

想法?任何人吗?

提前致谢。

ž

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

UPDATE2:好的,我知道现在是BOM问题。现在,我怎样才能摆脱那种讨厌的" EF BB BF"从file_get_content结果?

1 个答案:

答案 0 :(得分:0)

请按照建议here

尝试以下操作
// 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读取here。并使用

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