我正在使用move_uploaded_file()
将图片上传到服务器,但它会产生以下常见错误:
Warning: move_uploaded_file(upload/file.png) [function.move-uploaded-file]:
failed to open stream: No such file or directory in
/home/newuser/public_html/model/account.class.php on line 39
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move
'/tmp/phpuLkUgE' to 'upload/file.png' in
/home/newuser/public_html/model/account.class.php on line 39
这是非基于权限,因为我已将文件夹设置为777并具有root访问权限,ls -l
正确显示该文件夹。
755 /home/newuser/public_html/model
755 /home/newuser/public_html/model/account.class.php
777 /home/newuser/public_html/upload
PHP专线
move_uploaded_file($_FILES["photo"]["tmp_name"], "../upload/file.png");
我认为问题在于所有者/组设置配置不正确..前段时间我将所有网站都作为子域名放在一个帐户中:
/home/olduser/public_html/subdomains/index.html
然后我更改了这个并创建了一个新的用户帐户,以便更轻松地管理单独的网站,并将文件移到...
/home/olduser/public_html/subdomains
/home/newuser/public_html/index.html
/home/newuser
中的新文件夹现已拥有并归类为newuser newuser
,但我认为php可能会以nobody olduser
运行,因此可能导致此问题?
我可以尝试解决这个问题吗?
答案 0 :(得分:1)
特定文件/目录的权限不仅适用于目录本身,而且适用于导致它的整个路径。
示例:
/home/ - needs 'x' permission (execute)
/home/newuser/ - needs 'x' permission
/home/newuser/public_html/ - needs 'x' permission
/home/newuser/public_html/avatar/ - needs 'wx' permission (execute + write)
答案 1 :(得分:0)
在Jack的答案下间接地反映了Silver89的反馈,但并没有直截了当地说 - 所以我想提供一个答案,帮助我解决了这个让我长时间摸不着头脑的问题。 ;)
我为move_uploaded_file()的目标找到的最佳方法是使用完整的绝对路径。它可以根据您是在Unix \ Linux服务器还是Windows服务器上而有所不同,但这应该为您提供基本的想法。
在我的Unix服务器上工作时,你不能使用“../anything”,但必须使用/var/www/html/uploads/imagename.jpg
的完整绝对内部文件路径。
这就是为什么你的上一次测试对你有用,Silver89 - 因为你的服务器可能试图将图像上传到http://yourservername.com/upload/file.png
而不是http://www.yourservername.com/yoursubfolder/upload/file.png
。它可能完全抛弃了“../”部分,并且该文件夹在服务器上不存在。
您可以通过登录服务器(终端/ ssh等)并发出'pwd'命令或使用PHP代码并在剥离的php文件中回显getcwd()命令来找出完整路径名称是什么图像所在的文件夹。
This site有助于根据您的服务器使用不同的PHP服务器配置检查功能来解决这个问题 - 请参阅中间的表格。您可以简单地将这些回显到屏幕,例如:
echo $_SERVER["SCRIPT_FILENAME"].
这对我来说很难,所以我希望这会让下一个人找到更容易 - 即使这是8个月大。 ;)