My php program is not moving uploaded image to a directory (ubuntu)
我是PHP的开始。
我已经尝试了几个小时将上传的图像移动到一个目录,但没有成功。我已经阅读过关于这个主题的其他问题,但我无法解决这个问题:
1)我已经检查了目录是否存在(见下面的输出);
2)目录似乎是不可写的,但我不仅试图将图像保存在一种系统目录中,而且保存在我的计算机的一个简单目录中。
3)图像上传正确。
4)我已经使用了"sudo chmod-r 775/home/daniel/netbeansprojects/newphpproject/photos",但这不应该是问题,因为这不是系统目录!
我不知道发生了什么。
丹尼尔
请参阅下面的代码:
上传文件
1 2 3 4 5 6 7 8 9 10 11
| <html>
<body>
Upload your photo.
<form action="moveImage.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file">
<input type="submit" name="submit" value="Submit">
</form>
</body>
</html> |
移动图像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <?php
if ($_FILES["file"]["error"] > 0) {
echo"Error:" . $_FILES["file"]["error"] ."";
} else {
//$upload_dir = $_SERVER['DOCUMENT_ROOT'] ."/photos/";
//$upload_dir = dirname(__FILE__) ."/photos/";
$upload_dir ="/home/daniel/NetBeansProjects/NewPhpProject"."/photos/";
echo"upload_dir:" . $upload_dir ."";
if (file_exists($upload_dir)) {
if (is_writable($upload_dir)) {
$target = $upload_dir; //"dirname(__FILE__)" ."photos/";
$target = $target . basename($_FILES['file']['name']);
$moved = move_uploaded_file($_FILES['file']['name'],"$target");
} else {
echo 'Upload directory is not writable';
}
} else {
echo 'Upload directory does not exist.';
}
echo $target ."";
// echo dirname(__FILE__)."";
echo"Upload:" . $_FILES["file"]["name"] ."";
echo"Type:" . $_FILES["file"]["type"] ."";
echo"Size:" . ($_FILES["file"]["size"] / 1024) ." kB";
echo"Stored in:" . $_FILES["file"]["tmp_name"];
}
?> |
输出:
上传目录:home/daniel/netbeansprojects/newphpproject/photos/
上载目录不可写
上传:fotocaju.jpeg
类型:image/jpeg
大小:0.666015625 KB
存储在:/tmp/phpmtjwm中
- 目录的路径也必须是可写的。有许多解决方案,但我认为最好是在某个地方建立一个符号链接,让Apache可以将该链接写入到所需的目录中。
- @为什么是符号链接?
- @Phil是因为它很容易实现,如果项目被移动到另一个框中,也很容易记住,这使得将来很容易更改目标目录,并且不涉及更改用户主目录的权限。权限的存在是为了保护用户的安全,因此尽量避免授予超出必要的权限。
- 作为削弱photos目录权限的一种替代方法,您可以通过suexec或mpm-itk等工具将php脚本作为适当的用户运行。
- @但是你不能只对一个符号链接应用权限。真正的目的地仍然需要由脚本编写。我认为被评论过的__DIR__ . '/photos'是最好的方法。
- @ Phil。非常糟糕的想法。如果有人入侵了Apache,并且能够在运行Apache的任何用户下创建文件,那么整个计算机将受到污染,用户的所有个人数据都将被窃取。系统必须重新安装,即使备份和恢复您的个人数据也不安全,因为这些文件可能已被黑客修改。
- @phil使用sym链接的目的是只在一个目录(photos目录)上应用权限,而不是一路上的每个目录(如用户的主目录)。
- @先生,所以你是说,苏伊士型油轮,一种非常流行的解决这类问题的方法,是一个非常坏的主意?
- 为了清楚起见,其他注释解决方案"$upload_dir=$_server['document_root']。/photos/";"和"$upload_dir=dirname(文件)。"/运行了照片/";",出现了相同的问题。我认为问题是一种目录保护…这就是我尝试另一个目录的原因。
- @菲尔,我同意。您真的想让任何足够聪明的人在您的网站中发现一个安全漏洞,对Apache正在执行脚本的用户拥有完全的权限吗?@DanielTherocketman在访问目录的过程中,每个目录都必须具有必要的权限。你可以向/home和/home/Daniel/等申请755,但由于我在第二条评论中所述的原因,我不建议这样做。
- @首先,如果有人入侵了阿帕奇,你会遇到更大的问题。此外,脚本将以非特权用户的身份运行,以沙盒的形式保存到配置的目录中,从系统的角度来看,这使得整个环境更加安全。至于第二点,父目录只需要有执行权限(001)即可启用遍历。只需要将最终目录设置为可写
- @ Phil。我很抱歉。我指的是黑客Apache,我指的是黑客攻击你的网站,并找到一种执行代码的方法,允许他们劫持Apache。我的第二点是,即使用户是非特权用户,您是否希望某个黑客能够访问您在该计算机上的所有个人信息?你想给他们比Apache更多的特权吗?至于你的001理论,试试看。我刚试过,但没用。
您需要更改/home/daniel/NetBeansProjects/NewPhpProject/photos/的目录权限。为此,您将使用chmod命令。
美元:chmod +w /home/daniel/NetBeansProjects/NewPhpProject/photos/。
- 不幸的是,这不是问题所在。我刚刚(现在)试过,但问题仍然存在。我想这和上面第(4)项相似。
- @Danieltherocketman如果您运行的是Apache,那么它通常在www-data用户下运行,因此用户必须具有对该目录的写访问权。使用chmod 777 /home/daniel/NetBeansProjects/NewPhpProject/photos/,以便可以公开访问文件夹(r+w+e)。或者,您可以使用chown这个文件夹来拥有WWW数据,但这没有任何意义,因为它在丹尼尔用户的主目录中。
- 我按照你的建议修改了输出,并且"上传目录不可写"一行消失了(谢谢)。但是,图像不在这个目录中!我的代码中有什么缺失吗?
- @Danieltherocketman在用move_uploaded_文件声明$moved后检查它是否为真。如果它是错误的,请检查错误日志以查看是否还有其他错误。
- 再次感谢!你说得对,搬家是假的,但很奇怪。我检查了error.log(在/var/log/apache2$中),没有与上个小时的PHP执行相关的错误。
- 除了权限问题,代码中还有另一个错误,在move_uploaded_file函数中,第一个参数是错误的。参数应具有$u files['file'][tmpu name']而不是$u files['file'][name']。
- @在解决了权限问题之后,您的注释是纠正代码的基础。
php.net站点注释可写:
1
| Note : The results of this function are cached . See clearstatcache() for more details . |
试试看。在更改文件夹的权限之前,可能会将结果与结果一起缓存。
问题可能是,通往/home/daniel/NetBeansProjects/NewPhpProject/photos/的每一个目录都必须由apache编写。
由于更改主目录的权限通常不是一个好主意,因此您应该在Apache可以访问的某个位置建立一个符号链接,该位置在public_html之外(如/var/www指向您的目标目录),该目录应该具有Apache用户的正确权限。
- 这似乎也不是问题所在。也许我在PHP文件中做了一些错误。我不敢肯定。因为我现在使用的计算机是用于测试目的的,所以我已经更改了var、var/www和var/www/photos的权限。输出显示问题仍然存在:upload_dir:/var/www/photos//var/www/photos/fotocaju.jpeg not cool(意味着$moved为false)upload:fotocaju.jpeg type:image/jpeg size:0.666015625 kb存储在:/tmp/phpreleyf中
- 谁拥有这些目录,以及这些目录的权限是什么?@丹尼尔切罗克特曼
- 我在我的笔记本电脑里工作!所以,在论文中我可以改变一切。但我相信这不是你的问题!我如何知道权限?
- @danieltherocketman在命令行中,可以键入ls -al来显示详细信息。用户可以是任何东西,组应该是www-data或您的apache用户所在的任何组,权限应该是目录的drwxrwxr-x(也称为775),文件的-rw-rw-r--(也称为664)。
- 谢谢您!我来检查一下!
- 现在开始工作了!谢谢您!除了权限问题,@fazleeahee指出的代码中也有一个错误。请看上面的评论!我应该编辑问题(代码)以避免其他人的错误吗?正确的程序是什么?
- 不客气!了解Linux权限的工作方式对于确保您的服务器稳定和安全非常重要。如果您有任何与Linux直接相关的问题,请尝试使用Linux堆栈交换(当然是在谷歌搜索之后)。@丹尼尔切罗克特曼
- 你的第一句话根本不正确。Apache用户在/home和/home/daniel上需要的唯一权限,…/home/daniel/NetBeansProjects/NewPhpProject是执行位。请参阅unix.stackexchange.com/questions/13858/&hellip;