Как исправить mkdir () "Файловая система только для чтения" на виртуальном хостинге? - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь настроить функциональность, которая позволяет пользователю загружать файлы в каталог на сервере (общий хостинг). Пользователь может ввести имя папки загрузки и выбрать файлы. Если папка не существует, она создается.

Обратите внимание, что это не большая система загрузки, а только для одного пользователя.

Мой код отлично работает на localhost. На сервере publi c (общий хостинг) работает создание папки. Но в нем не отображаются файлы.

Функция загрузки, 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).

  • Я тестировал разные файлы и разные имена папок (новые и существующие), но файлы, которые я пытаюсь загрузить, никогда не отображаются.

  • I заметил, что несмотря на использование 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 для этой проблемы. Но как я могу go об этом при использовании виртуального хостинга?

Я впервые пытаюсь это сделать, и помощь очень ценится.

1 Ответ

0 голосов
/ 26 марта 2020

Я искал и пробовал еще немного. Это работает:

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

Теперь я могу загружать файлы в эту папку.

Спасибо за помощь! Я обязательно рассмотрю то, что вы предложили (и скорректирую права доступа), так как PHP все еще не является моей сильной стороной :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...