【发布时间】:2011-08-31 10:25:29
【问题描述】:
使用 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 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 行被 $filename = 'w h i t e s p a c e' 甚至 $filename = $panelname 替换,它会像第一个代码 n-p 中一样剪切文件名。但是我可以用 dottet-string-concat 语法替换 sprintf 并且它可以工作。
谁能告诉我,我忽略了什么?
【问题讨论】:
-
严格来说,您应该在标题中用双引号将文件名括起来:
Content-Disposition: attachment; filename="My File Name.ext"。如果您这样做,是否可以解决问题?
标签: php windows http filenames