下载文件时包含空格会导致错误 - PHP

Fer*_*ero 4 php

考虑我正在上传一个包含以下名称的文件:

  1. 检验.pdf
  2. test file.pdf

当我下载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)

提前致谢...

Ber*_*rak 5

案例是文件名之间的空格.

把它放在双引号中以解决问题.举个例子:

header('Content-disposition: attachment; filename="test file.pdf"');
header('Content-type: application/pdf');
readfile('test file.pdf');
Run Code Online (Sandbox Code Playgroud)

这应该工作.我刚刚尝试在带有空格的文件上使用readfile,这似乎没有引起任何问题.


hak*_*kre 5

content-disposition 标头不是 HTTP 的一部分(但常用于 HTTP 请求),请参阅RFC 2616

它的文档是RFC 2183的一部分,属于 MIME 域。它指定filename-param文件名实际上是其中的一部分valueRFC 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 stringtoken是一个单词):

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)

希望这有助于理解您的问题。