【问题标题】:move_uploaded_file() gives a Owner/Group errormove_uploaded_file() 给出所有者/组错误
【发布时间】:2012-06-05 02:51:13
【问题描述】:

我正在使用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 运行,所以这可能导致问题?

我可以尝试什么来解决这个问题?

【问题讨论】:

  • 如果您收到no such file or directory,则似乎临时上传的文件根本不存在,因此上传失败,而不是实际移动文件时出错。发布您的 PHP 代码。
  • @Michael 更新了错误代码以提供更清晰的理解

标签: php linux centos


【解决方案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)

【讨论】:

  • 权限都是应该的,我确定问题与Apache REMOTE_USER或所有者/组有关
  • @Silver89 另一种可能是 seLinux
  • @Silver89 还有,为了省心,你能把/home/home/newuser的权限加到帖子里吗? :)
  • 出于某种非常奇怪的原因,move_uploaded_file($_FILES["photo"]["tmp_name"], "../upload/file.png"); 不起作用,但 move_uploaded_file($_FILES["photo"]["tmp_name"], "/home/newuser/public_html/upload/file.png"); 起作用?
  • @Silver89 这很奇怪......也许它无法确定.. 是什么? :)
【解决方案2】:

Silver89 在 Jack's Answer 下的反馈中间接提到了这一点,但没有直接说明 - 所以我想提供一个答案,说明是什么帮助我解决了这个让我很长时间摸不着头脑的问题。 ;)

我为 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 个月大。 ;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2011-02-06
    • 2011-03-30
    • 2011-12-08
    • 2011-12-27
    相关资源
    最近更新 更多