Я пытаюсь настроить функциональность, которая позволяет пользователю загружать файлы в каталог на сервере (общий хостинг). Пользователь может ввести имя папки загрузки и выбрать файлы. Если папка не существует, она создается.
Обратите внимание, что это не большая система загрузки, а только для одного пользователя.
Мой код отлично работает на 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 об этом при использовании виртуального хостинга?
Я впервые пытаюсь это сделать, и помощь очень ценится.