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

时间:2011-07-22 07:33:32

标签: php

考虑我上传的文件名如下:

  1. 检验.pdf
  2. test file.pdf
  3. 当我下载test.pdf时,它工作正常..

    但是当我下载测试文件时.pdf却没有。 案例是文件名之间的空格。

    不幸的是我上传时不应该更改文件名(如果我可以在空格之间使用str_replace设置“_”并解决此问题)。

    现在该如何下载文件?

    我的代码如下:

    header('Content-disposition: attachment; filename=test file.pdf');
    header('Content-type: application/pdf');
    readfile('test file.pdf');
    

    提前致谢...

4 个答案:

答案 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部分。 valueRFC 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

另见RFC 2616, 2.2 Basic Rules

全部是US-ASCII,我认为空间需要逃避,例如双引号中的多个单词(其他字符也适用于quoted stringtoken只有一个单词):

header('Content-disposition: attachment; filename="test file.pdf"');

请注意,其他字符需要其他转义/编码,请参阅RFC 2047this 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;,它没有扩展名。