在使用PHP进行文件上传时,很多开发者会遇到一个奇怪的现象:文件名中的点号(.)被自动替换成了下划线(_)。这个问题看似简单,但实际上涉及到PHP的安全机制和配置设置。下面我们来详细解析这个现象的原因和解决方法。
这个现象是由PHP的dottie安全机制引起的。PHP默认会将上传文件名中的点号(.)替换为下划线(_),这是为了防止潜在的安全风险:
在php.ini配置文件中找到以下设置并修改:
; 默认值
upload_replace_dots = On
; 修改为
upload_replace_dots = Off
修改后需要重启Web服务器使配置生效。
如果无法修改服务器配置,可以在代码中手动处理文件名:
// 获取上传文件名
$filename = $_FILES['file']['name'];
// 将下划线还原为点号
$filename = str_replace('_', '.', $filename);
// 继续处理文件...
完全忽略原始文件名,使用自定义命名规则:
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$newFilename = uniqid().'.'.$extension;
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$newFilename);
PHP将上传文件名中的点号替换为下划线是一种安全机制,开发者可以通过修改配置或代码处理来解决这个问题。在决定解决方案时,需要权衡安全性和功能需求,选择最适合项目实际情况的方法。