PHP - HTTP标头中的文件名:空格问题

j0k*_*ker 7 php windows filenames http

使用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);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,标题中生成的文件名是"Project_1_w hitespac 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);
Run Code Online (Sandbox Code Playgroud)

现在Windows愿意用它的所有空格保存文件,但我仍然不明白为什么.如果我使用wireshark查看标题中的文件名,两者都是相同的.并且如果sprintf-line被替换为$filename = 'w h i t e s p a c e'或甚至$filename = $panelname它切割文件名,就像在第一个代码段中一样.但是我可以用dottet-string-concat语法替换sprintf并且它可以工作.

谁能告诉我,我在俯瞰什么?

qbe*_*220 7

区别在于双引号.使用第一个代码,您最终会得到:

Content-Disposition: attachment; filename=Project_1_w h i t e s p a c e s.jnlp
Run Code Online (Sandbox Code Playgroud)

使用第二个代码,你最终得到:

Content-Disposition: attachment; filename="Project_1_w h i t e s p a c e s.jnlp"
Run Code Online (Sandbox Code Playgroud)

你可能想要的是:

$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.'"');
Run Code Online (Sandbox Code Playgroud)

这会删除$ filename中的任何双引号,但确保$ filename始终用双引号括起来.