【问题标题】:How to fix mkdir() "Read-only file system" on shared hosting?如何修复共享主机上的 mkdir()“只读文件系统”?
【发布时间】:2020-07-05 20:37:41
【问题描述】:

我正在尝试设置允许用户将文件上传到服务器上的目录(共享主机)的功能。用户可以输入上传文件夹名称并选择文件。如果文件夹不存在,则会创建它。

请注意,这不是一个大型上传系统,但仅适用于一个用户。

我的代码在localhost 上运行良好。 使用公共服务器(共享主机),可以创建文件夹。但是里面没有文件显示。

上传功能,process.php:

// run code only if post request went through
if ($_SERVER['REQUEST_METHOD'] === 'POST' ) {

    if (isset($_POST['folder'])) {
        $folder = $_POST['folder'];
    } else {
        $folder = 'new-folder';
    }

    // ensure that there are files inside the array to actually upload
    if (isset($_FILES['files'])) {

        $errors = [];
        $path = '/dir/data/uploads/images/' . $folder . "/";

        // if folder does not exist, create it
        if (!file_exists($path)) {
            mkdir($path, 0777, true);
        } else {
            //stuff
        }

        $all_files = count($_FILES['files']['tmp_name']);

        for ($i = 0; $i < $all_files; $i++) {
            $file_name = $_FILES['files']['name'][$i];
            $file_tmp = $_FILES['files']['tmp_name'][$i];
            $file_type = $_FILES['files']['type'][$i];
            $file_size = $_FILES['files']['size'][$i];
            $tmp = explode('.', $_FILES['files']['name'][$i]);
            $file_ext = strtolower(end($tmp));

            $file = $path . $file_name;

            // here follow multiple verifications on the file name, type, size, etc...
            // removed to keep code shorter

            if (empty($errors)) {
                move_uploaded_file($file_tmp, $file);
            }
        }

        if ($errors) print_r($errors);
    } 
}

尝试和观察:

  • 在网络选项卡中,我得到status code 200

  • 服务器上目标文件夹images 的读写执行权限(暂时,用于测试!)设置为777(rwxrwxrwx)

  • 我测试了不同的文件和不同的文件夹名称(新的和现有的),但我尝试上传的文件从未显示。

  • 我注意到尽管在我的代码中使用mkdir($path, 0777, true); 创建文件夹,但服务器上的文件夹的权限设置为705(rwx---r-x)

  • 我对在localhost 上运行良好的版本的代码所做的唯一更改是我更改了$path

我收到的错误消息:

Warning: mkdir(): Read-only file system in /path/to/scripts/process/process.php on line 31
/folder/data/uploads/images/test/image.webp -- 
Warning: move_uploaded_file(/folder/data/uploads/images/test/image.webp): failed to open stream: No such file or directory in /path/to/scripts/process/process.php on line 75

因此:

Warning: move_uploaded_file(): Unable to move (...)
  • 第 31 行是mkdir($path, 0777, true);
  • 第 75 行是move_uploaded_file($file_tmp, $file);

我找到了几个针对此问题的 Linux 文件系统修复程序。但是在使用共享主机时我该怎么做呢?

这是我第一次尝试,非常感谢您的帮助。

【问题讨论】:

  • 你可以通过 ssh 连接吗?您很可能需要为公共上传创建一个文件夹,并指定您的主机允许 Web 用户(通常是 www 或 www-data)递归地写入该文件夹的公共组。类似 chown -R www-data:www-data images
  • 我认为他们只为云托管提供 ssh。但我可能错了。我从来没有使用过ssh。我可以调查一下。按原样,我可以更改我网站空间上文件夹的读写执行权限。但是即使我让每个人都可以读写文件,它也不起作用。
  • 目录 /dir/data/uploads/images/ 在您的公共 Web 根目录中吗?我在猜测,但只允许公共用户组上传到公共文件夹。我刚刚注意到的另一件事:您的图像具有您的主机可能不允许的扩展名 .webp。您是否尝试上传 jpg?
  • 它应该在公共网络根目录中,是的。 jpg的错误是一样的。但是,我的标头中有一个用于图像的 JavaScript 预加载函数,它向我返回状态代码 403 forbidden。还有两个 .htaccess 文件(一个在数据文件夹中,一个在上传文件中)。我没有写它们或把它们放在那里,我不确定这一点,但也许问题可能与这些 .htaccess 文件之一有关?我现在才想到。无论如何,我会调查他们。

标签: php file-permissions shared-hosting mkdir


【解决方案1】:

我搜索并尝试了更多。这有效:

 $path = $_SERVER['DOCUMENT_ROOT'] . '/data/uploads/images/' . $folder . "/";

我现在可以将文件上传到此文件夹。

感谢您的帮助!我一定会调查您建议的事情(并调整访问权限),因为PHP 仍然不是我的强项。 :)

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2019-10-24
    相关资源
    最近更新 更多