考虑我上传的文件名如下:
当我下载test.pdf时,它工作正常..
但是当我下载测试文件时.pdf却没有。 案例是文件名之间的空格。
不幸的是我上传时不应该更改文件名(如果我可以在空格之间使用str_replace设置“_”并解决此问题)。
现在该如何下载文件?
我的代码如下:
header('Content-disposition: attachment; filename=test file.pdf');
header('Content-type: application/pdf');
readfile('test file.pdf');
提前致谢...
答案 0 :(得分:5)
案例是文件名之间的空格。
用双引号括起来解决问题。举个例子:
header('Content-disposition: attachment; filename="test file.pdf"');
header('Content-type: application/pdf');
readfile('test file.pdf');
这应该有效。我刚刚尝试在带有空格的文件上使用readfile,这似乎没有引起任何问题。
答案 1 :(得分:4)
内容处置标头不是HTTP的一部分(但与HTTP请求一起使用很流行),请参阅in RFC 2616。
它的文档是RFC 2183的一部分,它位于MIME域中。它被指定为filename-param
,其文件名实际上是value
部分。 value
在RFC 2045 Appendix A -- Collected Grammar
中定义为:{/ p>
value := token / quoted-string
token := 1*<any (US-ASCII) CHAR except SPACE, CTLs,
or tspecials>
tspecials := "(" / ")" / "<" / ">" / "@" /
"," / ";" / ":" / "\" / <">
"/" / "[" / "]" / "?" / "="
; Must be in quoted-string,
; to use within parameter values
全部是US-ASCII
,我认为空间需要逃避,例如双引号中的多个单词(其他字符也适用于quoted string
,token
只有一个单词):
header('Content-disposition: attachment; filename="test file.pdf"');
请注意,其他字符需要其他转义/编码,请参阅RFC 2047和this pear ticket。
但最终你需要测试每个浏览器。我认为如果用文件名中的_
或-
替换空格会更加稳定,这会更容易:
header('Content-disposition: attachment; filename=test-file.pdf');
希望这有助于理解您的问题。
答案 2 :(得分:2)
考虑URL encoding文件名:
header('Content-disposition: attachment; filename=test%20file.pdf');
答案 3 :(得分:1)
如果使用&#39;标题&#39;用于下载文件的功能,特别是如果您将文件名作为变量传递,请记住用双引号括起文件名,否则只要有空格就会在Firefox中出现问题。文件名。
所以不要输入:
<?php
header("Content-Disposition: attachment; filename=" . basename($filename));
?>
你应该输入:
<?php
header("Content-Disposition: attachment; filename=\"" . basename($filename) . "\"");
?>
如果你不这样做,那么当用户点击名为&#34;带有spaces.txt&#34;的示例文件的链接的链接时,Firefox的另存为对话框将给出它的名称是&#34;示例&#34;,它没有扩展名。