根据与该主题相关的一些帖子,我终于想出了这个版本的"强制下载"代码:
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结果?
答案 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',
// ...