automatically generate safe fallback filename

This commit is contained in:
Christian Flothmann 2015-11-24 23:07:30 +01:00
parent ce60be5729
commit 03721e33a2
3 changed files with 27 additions and 0 deletions

View File

@ -160,6 +160,20 @@ class BinaryFileResponse extends Response
$filename = $this->file->getFilename();
}
if ('' === $filenameFallback && (!preg_match('/^[\x20-\x7e]*$/', $filename) || false !== strpos($filename, '%'))) {
$encoding = mb_detect_encoding($filename, null, true);
for ($i = 0; $i < mb_strlen($filename, $encoding); ++$i) {
$char = mb_substr($filename, $i, 1, $encoding);
if ('%' === $char || ord($char) < 32 || ord($char) > 126) {
$filenameFallback .= '_';
} else {
$filenameFallback .= $char;
}
}
}
$dispositionHeader = $this->headers->makeDisposition($disposition, $filename, $filenameFallback);
$this->headers->set('Content-Disposition', $dispositionHeader);

View File

@ -34,6 +34,11 @@ class BinaryFileResponseTest extends ResponseTestCase
$this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition'));
}
public function testConstructWithNonAsciiFilename()
{
new BinaryFileResponse(__DIR__.'/Fixtures/föö.html', 200, array(), true, 'attachment');
}
/**
* @expectedException \LogicException
*/
@ -49,6 +54,14 @@ class BinaryFileResponseTest extends ResponseTestCase
$this->assertFalse($response->getContent());
}
public function testSetContentDispositionGeneratesSafeFallbackFilename()
{
$response = new BinaryFileResponse(__FILE__);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'föö.html');
$this->assertSame('attachment; filename="f__.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html', $response->headers->get('Content-Disposition'));
}
/**
* @dataProvider provideRanges
*/