У меня есть веб-сайт, на котором отображается каталог/папки, где я могу загрузить несколько файлов в указанный каталог/папку, чтобы легко получить доступ к важным документам/статьям. Он прекрасно работал около года и внезапно перестал работать в прошлом месяце. Я знаю, что я не изменил свой код случайно, потому что у меня есть несколько папок с одним и тем же копированием/вставкой файла php в каждую папку, и мне было бы невозможно изменить каждый файл php.
Что странно, так это то, что если я попытаюсь загрузить по одному файлу за раз, произойдет сбой и будет загружен документ размером 0 байт. Если я загружаю несколько файлов, первый файл завершается с ошибкой и загружается документ размером 0 байт, но все последующие файлы могут быть успешно загружены.
Я не знаю, изменилось ли что-то с моим хостинг-провайдером или что-то изменилось с типом ввода = использованием файла, но был бы рад помощи. Спасибо!!
HTML
<form action = "upload.php" method = "post" enctype = "multipart/form-data">
<input type = "file" name = "fileToUpload[]" id = "fileToUpload" multiple = "multiple">
<input type = "submit" value = "Upload" name = "submit">
</form>
PHP
<?php
$targetDir = __DIR__ . '/'; // Directory where uploaded files will be stored
if (isset($_POST["submit"])) {
// Loop through each uploaded file
for ($i = 0; $i < count($_FILES["fileToUpload"]["name"]); $i++) {
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"][$i]); // Get the filename of the uploaded file
// Check if file already exists
if (file_exists($targetFile)) {
echo '<script>alert("Sorry, the file '. basename($_FILES["fileToUpload"]["name"][$i]). ' already exists.");</script>';
continue; // Skip to the next iteration of the loop
}
// Check file size (optional)
if ($_FILES["fileToUpload"]["size"][$i] > 100000000) { // Adjust the file size limit as per your requirements
echo '<script>alert("Sorry, your file '. basename($_FILES["fileToUpload"]["name"][$i]). ' is too large.");</script>';
continue; // Skip to the next iteration of the loop
}
// If the upload is successful, move the uploaded file to the target directory
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"][$i], $targetFile)) {
echo '<script>alert("The file '. basename($_FILES["fileToUpload"]["name"][$i]). ' has been uploaded.");</script>';
} else {
echo '<script>alert("Sorry, there was an error uploading your file.");</script>';
}
}
// Redirect back to the upload page
$redirectUrl = rtrim(dirname($_SERVER['PHP_SELF']), '/') . '/list.php';
echo '<script>window.location.href = "'.$redirectUrl.'";</script>';
}
?>
Я попробовал несколько разных компьютеров (личных и общедоступных) с Chrome, Safari, приложением Phone Brave, и ничего не помогло, поэтому подозреваю, что это связано с кодом или сервером.
Я пробовал менять разрешения (сейчас 0755), но безуспешно.
Я мало что знаю об изменении особенностей файлов/настроек на хост-сервере... Я пытался отключить htaccess и снова включить, но это ничего не дало.
Большое спасибо за подтверждение!! Есть какие-нибудь советы о том, что следует проверить в настройках моего сервера? Я использую PHP версии 7.3, которая, по моему мнению, является моей версией по умолчанию.
Попробуйте на своем локальном хосте. И попробуйте реализовать ту же настройку на своем сервере. Пожалуйста, проверьте php.ini на наличие таких конфигураций, как upload_max_filesize






Без доступа к серверу вам сложно помочь, но я попробую дать вам несколько советов.
Проблема может быть связана с поврежденным PDF-файлом. Загрузка может завершиться неудачей, даже если вы можете открыть файл с помощью программы чтения PDF-файлов. Итак, первое, что нужно сделать, это протестировать другие файлы PDF.
Проверьте логи php и мощность сервера. Возможно, файл слишком велик для обработки сервером. Вы можете увеличить максимальный размер загружаемых файлов, изменив конфигурацию PHP (upload_max_filesize, post_max_size и т. д.).
Возможно, проблема связана с изменением конфигурации брандмауэра, хотя это маловероятно, поскольку некоторые загрузки проходят, а другие нет.
Напишите тестовый файл, максимально простой и проверьте выложенные данные var_dump($_POST) и т. д.
Надеясь, что это может помочь.
Спасибо за предложения! Я не понимаю, это зависит от файла. Например, если я загружаю 2 файла одновременно, первый файл всегда выходит из строя, а второй всегда работает, то есть оба файла будут загружены, если я просто поменяю порядок. То же самое происходит с несколькими форматами файлов, такими как jpg и txt, аналогично только со вторым файлом и за его пределами (я попробовал 10 загрузок одновременно, и все, кроме первого, работали). Также не думайте, что это зависит от кода, поскольку я ничего не менял. Что касается № 2, где я могу найти журналы PHP. Я согласен, что это, вероятно, связано с сервером, но не знаю, с чего начать по этой теме. Я использую хостинг A2
Если вы хотите отправить мне доступ к своему серверу (FTP + менеджер сервера), я могу посмотреть, вы можете связаться со мной здесь: miglisoft.com/#contact
Спасибо, как мне отправить эту информацию? Мне удалось найти журналы ошибок. Что-то происходит с Apache FileScan.
[Вс, 14 апреля, 23:51:2024] [security2:error] [pid 6233:tid ] [клиент ***:58756] [клиент ***] ModSecurity: Внимание. Требуется соответствие «rx ^$» и «FILES_TMPNAMES:fileToUpload[]». [файл "/etc/apache2/conf.d/modsec_vendor_configs/imunify360-full-apache/014_i360_filescan.conf"] [строка "43"] [id "77317957"] [msg "IM360 WAF: отслеживать загрузку файла ||MV:/tmp/***||Размер:266622||Пользователь:***||SC:/home/***/upload.php||WPU:||T:APACHE| |"] [серьёзность "NOTICE"] [тег "service_im360"] [тег "noshow"] [имя хоста ".com"] [uri "/***/upload.php"] [уникальный_id "***"], реферер: https://***/list.php
ModSecurity обнаружил потенциальную проблему во время загрузки файла. Он ищет непустое имя временного файла, связанное с загруженным файлом, но оно может быть пустым или не соответствовать ожидаемому формату. Это может быть вызвано различными причинами, такими как: Ошибка в скрипте загрузки (upload.php). Неправильная настройка правил ModSecurity. Временный сбой в процессе загрузки. Вам следует сообщить об этом в службу хостинга и попросить их о помощи.
Омг исправлено! Хостинг-сервер так и не ответил, но в итоге я добавил небольшую задержку, что решило проблему. спать(0,5);
Я рад, что ты это исправил
Решено! В итоге вставил задержку в начале кода upload.php для учета задержки сервера, что решило проблему.... Все еще не уверен, что изменилось на сервере, поскольку код работал нормально более года...
<?php $targetDir = __DIR__ . '/';
// Directory where uploaded files will be stored
if (isset($_POST["submit"])) {
***sleep(0.5);***
// Loop through each uploaded file
for ($i = 0; $i < count($_FILES["file
...
Я протестировал код на своем локальном хосте и работает. Проблема может быть связана с вашим сервером. Как версия PHP или что-то в этом роде.