【问题标题】:move_uploaded_file failed yet permissions seem rightmove_uploaded_file 失败但权限似乎正确
【发布时间】:2013-01-09 10:42:59
【问题描述】:

我正在将我的网站从共享主机转移到 VPS。在我的 VPS 上进行测试时,我注意到突然之间我无法再通过网络表单上传文件了。

错误: Warning: move_uploaded_file(/uploads/logoklein.jpg): failed to open stream: No such file or directory in /var/www/vhosts/denkproducties.nl/httpdocs/denkproducties/upload.php on line 26 Warning: move_uploaded_file(): Unable to move '/tmp/php01nhmx' to '/uploads/logoklein.jpg' in /var/www/vhosts/denkproducties.nl/httpdocs/denkproducties/upload.php on line 26

关于 SO 的问题有很多,而且几乎都涉及设置权限。我将 TMP 和上传目录都更改为 0777(不寒而栗),但无济于事。我知道 0777 不是明智之举,但我想确保这不是这些文件夹的权限问题。

由于唯一改变的是 VPS,我认为问题一定出在服务器上。我想也许网络服务器是以“无人”的身份运行的,所以它无法访问 tmp 文件夹。我跑了:

ps aux | grpe httpd

这显示了我:

root   27371   0.0  2.3   340860   24726  ?   SNs   12:57   0:00   /usr/sbin/httpd
apache 27372   0.0  0.9   240994    9820 ?    SN    12:57   0:00   /usr/sbin/httpd
apache 27373   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
apache 27374   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
apache 27375   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
apache 27376   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
apache 27377   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
apache 27378   0.0  1.6   341671   16700 ?    SN    12:57   0:00   /usr/sbin/httpd
root   27817   0.0  0.0   103244     824 tty1 S+    13:40   0:00   grep httpd

顺便说一下,我的服务器正在运行 fCGI。

为了完整起见,我制作了一个带有网络表单的小型上传脚本:

$allowed_filetypes = array('.jpg','.gif','.bmp','.png'); // 这些将是通过验证的文件类型。 $max_filesize = 1024000; // 以 BYTES 为单位的最大文件大小(当前为 1MB)。 $upload_path = '/上传/'; // 文件将上传到的位置(当前为“上传”目录)。 $filename = $_FILES['userfile']['name']; // 获取文件名(包括文件扩展名)。 $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // 从文件名中获取扩展名。 // 检查文件类型是否允许,如果不允许则 DIE 并通知用户。 if(!in_array($ext,$allowed_filetypes)) die('您尝试上传的文件不被允许。'); // 现在检查文件大小,如果文件太大,则 DIE 并通知用户。 if(文件大小($_FILES['userfile']['tmp_name']) > $max_filesize) die('您尝试上传的文件太大。'); // 检查是否可以上传到指定路径,如果不行就DIE通知用户。 //if(!is_writable($upload_path)) // die('你不能上传到'.$upload_path .'指定目录,请CHMOD到777。'); // 将文件上传到您指定的路径。 if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename)){ echo '您的文件上传成功,请在此处查看文件'; // 有效。 } 别的 { echo '上传文件时出错。请再试一次。'; //它失败了:(。 }

我在这里错过了什么?

【问题讨论】:

  • 回声 $upload_path 。 $filename 并检查文件路径是否正常。
  • 它与 /uploads/logoklein.jpg 相呼应,这是正确的路径和文件名。
  • 会不会是upload/这个目录不见了?
  • 目录upload/在那里,目前chmodded到0777...
  • 删除upload_path变量中的第一个/(或用/var/www/vhosts/example.com/httpdocs/upload/之类的绝对路径替换它)。 PHP 可能会尝试将文件移动到文件夹 /upload,这是一个 unix 文件结构根文件夹,而不是 apache 文件夹。

标签: php linux apache plesk


【解决方案1】:

cmets 中的 Louis Huppenbauer 对我的类似问题给出了正确答案。

使用相对路径不起作用,它需要完整路径。尝试将 /uploads/ 更改为主机的完整目录,例如:D:\InetPub\Vhosts\website.com\website2.com\uploads\

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2022-10-06
    • 1970-01-01
    相关资源
    最近更新 更多