考虑我正在上传一个包含以下名称的文件:
当我下载test.pdf它工作正常..
但是,当我下载测试文件.pdf时,它没有.案例是文件名之间的空格.
不幸的是我上传时不应该更改文件名(如果我可以在空格之间使用str_replace设置"_"并解决此问题).
现在我应该如何下载文件?
我的代码如下:
header('Content-disposition: attachment; filename=test file.pdf');
header('Content-type: application/pdf');
readfile('test file.pdf');
Run Code Online (Sandbox Code Playgroud)
提前致谢...
案例是文件名之间的空格.
把它放在双引号中以解决问题.举个例子:
header('Content-disposition: attachment; filename="test file.pdf"');
header('Content-type: application/pdf');
readfile('test file.pdf');
Run Code Online (Sandbox Code Playgroud)
这应该工作.我刚刚尝试在带有空格的文件上使用readfile,这似乎没有引起任何问题.
content-disposition 标头不是 HTTP 的一部分(但常用于 HTTP 请求),请参阅RFC 2616。
它的文档是RFC 2183的一部分,属于 MIME 域。它指定filename-param文件名实际上是其中的一部分value。RFC 2045 附录 A — 语法收集
中将其value定义为:
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
Run Code Online (Sandbox Code Playgroud)
另请参阅RFC 2616, 2.2 基本规则。
这就是全部US-ASCII,我假设空格需要转义,例如双引号中的多个单词(其他字符也适用于此quoted string,token是一个单词):
header('Content-disposition: attachment; filename="test file.pdf"');
Run Code Online (Sandbox Code Playgroud)
请记住,其他字符需要其他转义/编码,请参阅RFC 2047和此 pear Ticket。
但最终您需要使用每个浏览器进行测试。我认为如果将文件名中的空格替换为_或会更容易-,这样会更稳定:
header('Content-disposition: attachment; filename=test-file.pdf');
Run Code Online (Sandbox Code Playgroud)
希望这有助于理解您的问题。