【问题标题】:Cannot create directory with mkdir无法使用 mkdir 创建目录
【发布时间】:2018-02-06 10:27:45
【问题描述】:

我有下面的 upload_files 脚本可以在我的开发服务器(XAMPP Apache 2.4.17 和 PHP 5.6.23)上运行,但我无法让它在我的生产服务器(Synology diskstation、apache 2.2.31 php 5.6. 30)

它无法在数据目录中创建目录SY2017_18(数据目录确实存在)。数据目录具有以下权限: drwxrwxr-x 1 管理员用户 234 Aug29 09:59 数据

我检查了 php.ini 并且:

file_uploads = On
upload_tmp_dir = "var/services/tmp"

非常感谢任何帮助。

// upload_files script
if(isset($_FILES['my_file'])){    
    $errors= array();
    $file_name = $_FILES['my_file']['name'];
    $file_size =$_FILES['my_file']['size'];
    $file_tmp =$_FILES['my_file']['tmp_name'];
    $file_type=$_FILES['my_file']['type'];
    $file_ext=strtolower(end(explode('.',$_FILES['my_file']['name'])));
    $extensions= array("jpg","png");

if(in_array($file_ext,$extensions)=== false){
    $errors[]="extension not allowed, please choose a Spreadsheet file.";
}

if($file_size > 2097152){
    $errors[]='File size must be less than 2 MB';
}

if(empty($errors)==true){
    $folder = $_SERVER['DOCUMENT_ROOT']."/pdo/data/SY".$thisschoolyear;
    if(!is_dir($folder)){
        if (mkdir($folder, 0755)) {
        } else echo "NO luck creating the folder $folder<br>";
    }
}

}

【问题讨论】:

  • 你好,看看这个帖子*.com/questions/927564/…,它可以帮助你理解mkdir返回false的原因。
  • 作为权限问题的快速检查,把目录改成777看看能不能用。
  • 很长,我已经阅读了很多关于这个问题的帖子,并且由于语法错误,mkdir 总是失败。如上所述,我的代码在 XAMPP 上运行良好,所以我总是很确定问题出在权限上。不幸的是,我是 Linux 的新手,所以这对我来说是全新的领域。

标签: php


【解决方案1】:

确保您的代码在其中创建 $folder 的目录的所有者设置为 Apache

最好的办法是检查您是否在脚本顶部收到ini_setting 的任何许可等通知(仅在错误关闭的情况下)。

ini_set("display_errors", 1);
error_reporting(E_ALL & ~E_NOTICE);

这也会显示通知。

祝你好运!

【讨论】:

  • 好的,我打开了显示错误,我得到了我期望的错误 - 权限被拒绝。不知道关于 Linux 的任何有价值的东西,开始工作。首先,我尝试按照您的建议将用户设置为 Apache,认为这将是一个“开箱即用”的用户,但我得到了无效用户:aApachea。所以我创建了一个用户(sudo useradd Apache)但收到错误消息:useradd: command not found
  • 我不知道你用过什么命令栈。这可能对你有帮助,askubuntu.com/questions/520634/…
  • 诺曼,我不明白的是这个用户(Apache - 在这个目录中拥有权限)和任何想要上传文件的用户之间的联系。我目前有一个用户(管理员),为什么要更改它?
  • 诺曼,我终于明白了! Synology 有自己的前端来管理用户。有一个组 (http),它是具有只读权限的 Web 用户的系统默认组。我让这个组 rwx 访问数据文件夹,一切都很好。非常感谢。现在我只需要理清打开错误消息时抛出的“只能通过引用传递变量”的问题:(
  • 很高兴你知道了。你能在参考问题上搜索一下吗?我确信这个问题已经在谷歌上有无数的答案。 ;)