Symfony:强制文件下载编码不起作用

时间:2018-03-21 07:34:37

标签: php file symfony csv

我在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));
}

为了获得与我使用的完全相同的世界,我应该改变什么? 任何帮助将不胜感激。

1 个答案:

答案 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 ++)打开文件,查看字符的外观以及检测到的编码。