Работа с CakePHP и Java Web Start Я генерирую необходимый .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», в то время как 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-строка заменяется на $filename = 'w h i t e s p a c e'
или даже $filename = $panelname
, это сокращает имя файла, как в первом codenini. Но я могу заменить sprintf синтаксисом dottet-string-concat, и он работает.
Может кто-нибудь сказать мне, что я пропускаю?