Symfony2 - 文件下载和“文件名后备必须仅包含 ASCII 字符。” 错误

Dav*_*rko 5 php symfony

此处使用 Symfony 2.5,用户将 MS Office 文件上传到我们的应用程序中,并在以后根据需要下载。现在,当文件附件包含非 ASCII 字符(这很常见,因为我们来自捷克共和国),Symfony 会引发错误“文件名回退必须仅包含 ASCII 字符。”

我发现了很多关于这个问题的报告和讨论,例如

https://github.com/symfony/symfony/issues/9093

...但没有真正的解决方案。我知道在制作 Content-Disposition 标头时我可以将文件名转换为 ascci,但它会更改呈现给用户的文件名,这对用户来说并不好而且相当误导。有没有办法避免这种情况并能够提供以前的文件名?能够下载文件名中包含非 ASCII 字符的文件在互联网上很常见,那么为什么有这个限制呢?

按照此How to Encode the filename parameter of Content-Disposition header in HTTP? 我什至尝试使用 urlencode() 对文件名进行编码,但现在它说 % 不允许使用 char :-(

更新 1: 这是我正在使用的代码片段。我正在使用流式传输对浏览器的响应,并且我认为标头是手动定义的。

$response = new StreamedResponse();
$response->headers->set('Content-Type', $upload->getMimeType());
$contentDisposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $upload->getFilename());
$response->headers->set('Content-Disposition', $contentDisposition);
Run Code Online (Sandbox Code Playgroud)

luc*_*nov 6

Symfony 4$filenameFallback具有HeaderUtils::makeDisposition.

例子

$filenameFallback = preg_replace(
    '#^.*\.#', 
    md5($filename) . '.', $filename
);

$disposition = $response->headers->makeDisposition(
    ResponseHeaderBag::DISPOSITION_ATTACHMENT, 
    $filename, 
    $filenameFallback
);

$response->headers->set('Content-Disposition', $disposition);
Run Code Online (Sandbox Code Playgroud)