我在symfony项目中创建了一个函数,强制在点击基于this answer的按钮时下载CSV文件。问题是下载工作正常,但文件的编码似乎是错误的。
frensh caracters '
,é
,à
和è
变为‚Äô
,é
......
我的职能:
/**
* exportNewsAction
*
* @Route("/getNewsSections", name="newsitem_getNewsSections", options = { "expose" = true })
* @Method({"GET", "POST"})
*/
public function exportNewsAction() {
$path = $this->get('kernel')->getRootDir().'/Resources/files/csvExport';
$csvPath = $path."/News-Item-".$now.".csv";
$response = new Response();
$f = fopen($csvPath, "w");
$titleArray=array('Id', 'Nom', 'Prénom', 'Profile', 'Status', 'Date de création');
fputcsv($f, $titleArray);
// Set headers
$response->headers->set('Cache-Control', 'private');
$response->headers->set('Content-type', mime_content_type($csvPath));
$response->headers->set('Content-Disposition', 'attachment; filename="' . basename($csvPath) . '";');
$response->headers->set('Content-length', filesize($csvPath));
// Send headers before outputting anything
$response->sendHeaders();
return $response->setContent(file_get_contents($csvPath));
}
为了获得与我使用的完全相同的世界,我应该改变什么? 任何帮助将不胜感激。
答案 0 :(得分:1)
如果您要强制下载文件并保留其原始内容,最好使用BinaryFileResponse
而不是常规Response
。它正在您的代码中手动执行所有操作,然后执行一些操作。您的控制器代码可能如下所示:
public function exportNewsAction() {
$path = $this->get('kernel')->getRootDir().'/Resources/files/csvExport';
$csvPath = $path."/News-Item-".$now.".csv";
$response = new BinaryFileResponse($csvPath);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
basename($csvPath)
);
return $response;
}
另外,您如何打开下载的CSV?如果您使用的是MS Excel,则很可能无法正确检测编码。尝试使用一些文本编辑器(如Notepad ++)打开文件,查看字符的外观以及检测到的编码。