Symfony2-文件下载和';文件名回退必须仅包含ASCII字符';错误


Symfony2 - File download and 'The filename fallback must only contain ASCII characters.' error

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

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

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

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

遵循以下内容如何在HTTP中对Content-Disposition标头的文件名参数进行编码?我甚至试着用urlender()编码文件名,但现在它说%是不允许的字符:-(

更新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);

Symfony 4在HeaderUtils::makeDisposition中有$filenameFallback

示例

$filenameFallback = preg_replace(
    '#^.*'.#', 
    md5($filename) . '.', $filename
);
$disposition = $response->headers->makeDisposition(
    ResponseHeaderBag::DISPOSITION_ATTACHMENT, 
    $filename, 
    $filenameFallback
);
$response->headers->set('Content-Disposition', $disposition);