我知道这个问题以前已经解决过,但这些程序具有标头功能,而我使用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()
来正确处理所有场景。