PHP文件上传失败问题

在测试PHP文件上传功能的时候一直没有成功,查阅了一下资料,出于服务器安全考虑,一般在apache配置文件中作php_admin_value open_basedir 的限制,防止php程序浏览整个硬盘,这个限制在使用虚拟主机的服务器上使用的更多。

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中慎用’/’绝对路径,尽量使用预定义变量

点赞

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注