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

时间:2014-09-05 07:46:40

标签: 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);

1 个答案:

答案 0 :(得分:0)

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