Я создал веб-сайт с HTML-формой / загрузкой PHP для файлов изображений, он хорошо работает, когда он запускается на XAMPP на моем локальном компьютере, но когда я загрузил его на 000webhost большую часть времени, он говорит недействительный файл и только иногда будет изображения успешно загружаются. Я попытался увеличить максимальное время выполнения в конфигурации php, но, похоже, не исправил его. Файлы, которые я пытался загрузить, меньше, чем максимальный размер файла в конфигурации php и отлично работают на моей тестовой машине.
Мне показалось странным, что он работает иногда, а не в другое время и не знает, что попробовать.
РЕДАКТИРОВАТЬ:
Вот форма Имя файла:
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/png"))) { if ($_FILES["file"]["error"] > 0) { echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />"; move_uploaded_file($_FILES["file"]["tmp_name"], "churchimages/pauls.jpeg"); echo "Stored in: " . "churchimages/pauls.jpeg"; } } else { echo "Invalid file";//This is the section I am seeing }
$_FILES["file"]["type"]
типа вашего файла опирается на $_FILES["file"]["type"]
, который отправляется браузером и крайне ненадежен.
Гораздо лучший способ определить, является ли загруженный файл изображением, является getimagesize()
.
$info = getimagesize($_FILES["file"]["tmp_name"]); $allowed_types = array(IMG_GIF, IMG_JPEG, IMG_PNG); if (in_array($info[2], $allowed_types)) { .... do stuff ... }
Вы должны проверить, действительно ли загрузка действительно была выполнена FIRST, прежде чем выполнять какие-либо другие операции:
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) { ... handle upload... if (!move_uploaded_file(...)) { // <--important. ALWAYS check if the move worked. die("File move failed. Data is lost"); } } else { die("Upload failed with code " . $_FILES['file']['error']); }
В случае, когда загрузка не произошла, поле ['type']
не будет установлено, и просто сказать «недопустимый файл» будет бесполезным – файл вообще отсутствует.
Как указал Пекка, вы должны использовать другие методы определения типа файла. Данные ['type']
в $ _FILES предоставляются пользователем и тривиальны для подделывания.
Убедитесь, что вы определяете абсолютный путь для загруженных файлов, а не относительный.
У меня сегодня был этот вопрос .. очень грустно. потребовалось около часа на ремонт.
Идея: проверка на $ _FILES ["file"] ["type"] == "image / gif" в верхней части скрипта – это то, что мне не удалось . Кажется, браузер заселял «BLANK DATA» вместо «image / gif», поэтому моя первоначальная проверка сбрасывалась каждый раз «недопустимым типом файла»,
Вопрос. Кажется, браузеры неправильно отправляют файл типа из каталога tmp?
Мой FIX: удалите проверку типа файла …. как указано выше, это очень ненадежно …
Проверьте права доступа к файлу PHP. в ooowebhost вы можете найти его в chmod. измените на '777'. в противном случае у файла нет прав на выполнение / запись