PHP - имена файлов в HTTP-заголовки: проблема с пробелами

Работа с CakePhp и Java Web Начните, я создаю необходимый файл .jnlp в контроллере, в котором среди прочего я установил имя файла в виде заголовка. Это работает нормально, пока я не пытаюсь использовать специальные символы в имена файлов. Однако я хотел бы включить каждый персонаж, который возможен в основных операционных системах в качестве имени файла. Итак, что я пытаюсь сделать, это удалить все недопустимые символы, заменив их через пустые строки. Но, кажется, есть проблема с пробелами, которые должны быть допущены в имена файлов.

Это код:

$panel_id = 1
$panelname = 'w h i t e s p a c e s';
$filename = sprintf('"Project_%d_%s.jnlp"', $panel_id, $panelname);
$invalid_chars = array('<', '>', '?', '"', ':', '|', '\\', '/', '*', '&');
$filename = str_replace($invalid_filenamechars, '', $filename);
$this->header('Content-Disposition: attachment; filename=' . $filename);

Когда я это делаю, полученное имя файла в заголовке - «Project_1_w h i t e s p a c e», а Windows 7 хочет сохранить файл как «Project_1_W». Так кажется, что моя ОС не принимает неиспользованные пробелы в именах файлов? Я был бы доволен этим объяснением, если бы не только для следующего: я покинул линии 4 и 5, чтобы код выглядел

$panel_id = 1
$panelname = 'w h i t e s p a c e s';
$filename = sprintf('"Project_%d_%s.jnlp"', $panel_id, $panelname);
$this->header('Content-Disposition: attachment; filename=' . $filename);

, и теперь Windows готов сохранить файл со всеми его пробелами, все же я не могу понять Почему. Если я посмотрю на имена файлов в заголовках, используя Wireshark, оба одинаковы. И если SPRINTF-Line заменяется $ filename = 'w h i t e s p a c e' или даже $ filename = $ PanelNameName Это разрезает имя файла как в первом кодовом элементе. Но я могу заменить Sprintf с синтаксисом Dottet-String-Concat, и он работает.

Кто-нибудь может сказать мне, что я упускаю из виду?

7
задан j0ker 31 August 2011 в 10:25
поделиться