在这里使用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);