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


File downloading giving error when file has %20. (PHP)

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

问题是,每当一个文件中有%20时,它就无法下载。

它给出404错误和文件

例如:no%love.mp3

得到替换没有爱.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(),但我不确定我应该在哪里使用它

提前谢谢。

我认为@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

最佳解决方案:只是文件名中没有实际的%20;在上传时修复此问题。允许它们会让你头疼(可能意味着你没有以其他方式正确验证文件名,让你容易受到各种黑客攻击)。

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