在测试PHP文件上传功能的时候一直没有成功,查阅了一下资料,出于服务器安全考虑,一般在apache配置文件中作php_admin_value open_basedir
open_basedir错误
上传文件处理代码
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
#move_uploaded_file($_FILES["file"]["tmp_name"], "/upload/" . $_FILES["file"]["name"]);
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);相对于执行文件的路径
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
但是提示错误
Warning: Unknown: open_basedir restriction in effect. File(D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot/Default/phptest/a.php) is not within the allowed path(s): (D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot/Default/WebRoot) in Unknown on line 0
Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
Fatal error: Unknown: Failed opening required 'D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot/Default/phptest/a.php' (include_path='.;C:\php5\pear') in Unknown on line 0
错误提示的是打开文件的限制目录为D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot/Default/WebRoot,而请求的目录为D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot/Default/phptest/a.php,不在限制范围内,这说明应该是配置文件出错了
打开Apache的安装目录下conf下的httpd-vhosts.conf文件,修改配置
<VirtualHost *:80>
ServerAdmin admin@myhost.com
DocumentRoot "D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot/Default"
php_admin_value open_basedir "D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot"
ServerName localhost
ErrorLog logs/default-error_log
CustomLog logs/default-access_log common
</VirtualHost>
将open_basedir配置修改正确后,重启服务器,方法为计算机(右键->管理)->服务和应用程序->服务,找到Apache服务,重启即可。
重新测试一遍
上传文件名: welcome.txt
文件类型: text/plain
文件大小: 0.017578125 kB
文件临时存储的位置: D:\mysoftware\DedeAMPZ\DedeAMPZ\tmp\uploads\phpFC2A.tmp文件存储在: upload/welcome.txt
绝对路径的使用
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
if (file_exists("/upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "/upload/" . $_FILES["file"]["name"]);
#move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);#相对于执行文件的路径
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
错误
文件临时存储的位置: D:\mysoftware\DedeAMPZ\DedeAMPZ\tmp\uploads\phpD5A.tmp
Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/upload/welcome.txt) is not within the allowed path(s): (D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot) in D:\mysoftware\DedeAMPZ\DedeAMPZ\WebRoot\Default\phptest\a.php on line 14
Warning: move_uploaded_file() [function.move-uploaded-file]: open_basedir restriction in effect. File(/upload/welcome.txt) is not within the allowed path(s): (D:/mysoftware/DedeAMPZ/DedeAMPZ/WebRoot) in D:\mysoftware\DedeAMPZ\DedeAMPZ\WebRoot\Default\phptest\a.php on line 21
文件存储在: upload/welcome.txt
绝对路径的使用是有问题的,PHP中的绝对路径指向不同与于html和其他一些语言,指向的不是网站的根目录(具体指向的是哪就不清楚了,应该是盘的根目录),那么怎么解决呢
使用预定义变量$_SERVER[‘DOCUMENT_ROOT’]获取前运行脚本所在的文档根目录。该根目录是由服务器配置文件中定义。例如apache配置文件httpd.conf中DocumentRoot配置项的值。
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "错误:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
if (file_exists($_SERVER['DOCUMENT_ROOT']."upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"],$_SERVER['DOCUMENT_ROOT']. "/upload/" . $_FILES["file"]["name"]);
#move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]);#相对于执行文件的路径
echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
结果:
上传文件名: welcome.txt
文件类型: text/plain
文件大小: 0.017578125 kB
文件临时存储的位置: D:\mysoftware\DedeAMPZ\DedeAMPZ\tmp\uploads\php7D90.tmp文件存储在: upload/welcome.txt
所以,在PHP中慎用’/’绝对路径,尽量使用预定义变量