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

时间:2016-04-16 03:33:08

标签: php download

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

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

它提供 404错误和文件

例如:否%love.mp3

替换为没有love.mp3

我尝试在文件名之间上传%20的文件,当我点击下载链接时,会打开 file not found error

上传包含空格的文件时没有问题。他们正在按原样下载。该问题仅出现在包含%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(),但我不确定应该在哪里使用它。

提前致谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

最佳解决方案:只是没有包含实际%20的文件名;修复上传时间。允许它们会给你带来麻烦(可能意味着你没有以其他方式正确验证文件名,让你对各种黑客开放)。

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