当文件有 %20 时,文件下载给出错误。 (PHP)

Posted

技术标签:

【中文标题】当文件有 %20 时,文件下载给出错误。 (PHP)【英文标题】:File downloading giving error when file has %20. (PHP) 【发布时间】:2016-04-16 03:33:07 【问题描述】:

我知道这个问题之前已经解决了,但是这些程序具有标头功能,而我使用 a href 来启用文件下载。

问题是,只要文件中包含 %20,它就会无法下载。

它给出了一个404错误和文件

例如:no%love.mp3

得到没有love.mp3的替换

我尝试上传文件名之间带有 %20 的文件,当我单击下载链接时,它会打开一个找不到文件错误

当我上传带有空格的文件时没有问题。它们按原样下载。该问题仅出现在带有 %20 的文件中。

下载代码:

if ($dir_list = opendir($dir))

while(($filename = readdir($dir_list)) != false)

if ($filename != '.' && $filename != '..') //removing . and .. files


?>
<p><a href="<?php echo $dir . '/' . $filename; ?>" target="_blank"> //download link
<?php echo $filename;?></a></p> //displaying the file name
<?php



closedir($dir_list);

请帮我解决这个问题。我想过使用 str_replace() 但我不确定我应该在哪里使用它。

提前致谢。

【问题讨论】:

您可能没有进行 URL 解码。 非常感谢您的回复。它使用 Alfie 的代码工作。 【参考方案1】:

我认为@Suresh Koya 是正确的,只是您需要对其进行编码。

%20 在 URL 的上下文中被认为是一个空格字符,我相信你知道。

如果您的文件名包含 %20,而您只是像以前一样直接打印它,浏览器会将其解释为空格,而不是文字 %20。

因此,您需要在打印之前对文件名进行 urlencode()。这样 %20 将被完全读取,并且不会将其交换为空格。

所以,你的答案:

<p><a href="<?php echo $dir . '/' . urlencode($filename); ?>" target="_blank"> //download link <?php echo $filename;?></a></p> //displaying the file name

【讨论】:

不客气。正如我看到您正在尝试的那样,也值得听听 Ed 的回答。如果您在上传时使用 urldecode() 文件名,它会立即为您删除那些编码字符。这将使您不必每次都对其进行 urlencode() ;如果您定期打印,很容易忘记偶尔这样做。但更好的是在上传时使用正则表达式模式或其他东西从文件名中删除任何不是字母或数字的内容。 非常感谢 Alfie,我使用了 preg_replace() 函数,它正在工作。【参考方案2】:

最佳解决方案:只是没有包含实际%20 的文件名;在上传时修复它。允许它们会让您头疼(并且可能意味着您没有以其他方式正确验证文件名,从而使您面临各种黑客攻击)。

也就是说,如果您的名称中必须包含文字 %20,那么 URL 需要包含 %2520(编码的 % 和文字 20)。生成 URL 时,您需要使用 urlencode() 正确处理所有场景。

【讨论】:

非常感谢您的回复。虽然我使用了 Alfie 建议的技术,但你还能告诉我该怎么做吗?我的意思是验证 %20 的文件?我对php有点新,所以我对方法没有信心。 @LazyNinja 为了安全起见,只需用破折号 (-) 替换任何不是字母数字的内容。如果您将原始字符串传递给文件系统,有很多巧妙的方法可以被黑客入侵。您只想传递最安全的字符子集(a-z、0-9 和 -)。 好的,我明白了,我一定会记住这一点。非常感谢。

以上是关于当文件有 %20 时,文件下载给出错误。 (PHP)的主要内容,如果未能解决你的问题,请参考以下文章

Moodle上传scorm错误

为啥当我的着色器文件的所有信息都正确读入字符串并且语法正确时,OpenGL会给出语法错误

无法让 PHP 报告错误

CodeIgniter 2,Ion Auth 在配置文件编辑时给出 CSRF 错误消息

PHP使用for或语句给出错误

逐行读取文件然后哈希它们,在php中给出错误的输出