我知道此问题之前已经解决,但这些程序具有标题功能,而我使用 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(),但我不确定应该在哪里使用它。
提前致谢。
答案 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()
来正确处理所有方案。