Этот урок набрал набрал достаточно большое количество комментариев и дальнейшее его комментирование отключено. Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку, посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали. Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
fantasyz 24.04.2018 в 21:28
$srcFileName = $file['name'];
$sizeFile = $file['size'];
$filePath = $file['tmp_name'];
$newFilePath = __DIR__ . '/upload/' . $srcFileName;
$image = getimagesize($filePath);
$limitWidth = 1280;
$limitHeight = 720;

1.

if ($sizeFile > 8000000) {
    $error = 'размер файла слишком большой';
}

2.

elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
    $error = 'размер файла слишком большой';
}

3.

else if ($image['1'] > $limitWidth || $image['0'] > $limitHeight) {
    $error = 'разрешение картинки слишком велико';
}
ivashkevich 25.04.2018 в 08:51

Очень хорошо!

Замечание по первому заданию - 8МБ это всё-таки 8 * 1024 * 1024. Можно прямо так в коде и записать.

А в третьем задании стоит воспользоваться функцией getimagesize(), она более надёжна, так как позволяет узнать размеры картинки на стороне сервера. Кроме того, она может вернуть false, что будет говорить о том, что картинка мягко говоря "неправильная". Цифры в вашем примере пришли из браузера - это менее надежно. Они могут прийти от клиента какими угодно. А могут и вовсе не прийти, и тогда будет warning, так как ключей 0 и 1 в массиве не окажется.

fantasyz 25.04.2018 в 20:37

так я же применяю функцию getimagesize() к временному файлу вот тут $image = getimagesize($filePath); и беру из полученого массива соответствующие данные для сравнения с задаными

ivashkevich 25.04.2018 в 20:44

Прошу прощения, не увидел. Тогда всё отлично. Единственное - переменную лучше назвать $imageSize.

fantasyz 25.04.2018 в 20:47

Спасибо, исправлю)

Bogdan 30.12.2018 в 09:20
$image = getimagesize($filePath);
$limitWidth = 1280;
$limitHeight = 720;
else if ($image['1'] > $limitWidth || $image['0'] > $limitHeight) {
    $error = 'разрешение картинки слишком велико';
}
разве этот код верный? ($image['1'] > $limitWidth) здесь идет сравнение Height с Width; ($image['0'] > $limitHeight) - а здесь Width с Height... или я что-то перепутал?
ivashkevich 01.01.2019 в 10:02

Видимо и правда ошибка

studentDev 12.04.2020 в 13:33

Перепутал width с height, а height с width.

1nSide 17.05.2018 в 13:14

Почитал разобрался)

<?php

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '\upload' . $srcFileName;
    $fileSize = $file['size'];
    $limitBytes  = 1024 * 1024 * 8;
    $limitWidth  = 1280;
    $limitHeight = 768;
    $filePath = $file['tmp_name'];
    $image = getimagesize($filePath);

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if ($fileSize > $limitBytes) {
        $error = 'Размер файла слишком большой';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла слишком большой';
    } elseif ($image[1] > $limitHeight || $image[0] > $limitWidth){
        $error = 'Привышенно допустимое разрешение картинки';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($filePath, $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/upload/upload.php' . $srcFileName;
    }
}

?>

<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 17.05.2018 в 19:37

Отлично! :)

Kostiashka98 09.03.2024 в 21:44

если не выбрать файл и нажать 'Отправить', будет ошибка.
Fatal error: Uncaught ValueError: Path cannot be empty in W:\domains\myproject.loc\www\Begin\Server\upload.php on line 14
ValueError: Path cannot be empty in W:\domains\myproject.loc\www\Begin\Server\upload.php on line 14
Или это только у меня так?

Nikolas 13.07.2018 в 11:14

у меня вопрос, проверка условия if (!move_uploaded_file($file['tmp_name'], $newFilePath)) и сразу выполнит саму функцию move_uploaded_file и использует ее же в проверке условия?Мне казалось,что нужно ее сначала выполнить,после чего она вернет true или false и только потом использовать ее в проверке условия?

ivashkevich 14.07.2018 в 09:30

Да, отработает именно так, как вы и написали. Сначала выполнится и вернёт результат, который сразу будет проверен в условии. Можно и в переменную положить, $isUploaded, например, а затем проверять её.

Fox-24 15.08.2018 в 16:38

Еще один замечательный урок пройден :)

<?php

// Позвольте загружать только файлы размером меньше 8Мб. Сделайте это с помощью сравнения с $_FILES['attachment']['size'].
// Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер.
// Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].
// Разрешите загружать картинки с шириной не более 1280px и высотой не более 720px.

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $errorCode = $_FILES['attachment']['error'];
    $filePath = $_FILES['attachment']['tmp_name'];
    $fileSize = $_FILES['attachment']['size'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION); //

    // Проверка на ошибки из $_FILES
    if ($errorCode !== UPLOAD_ERR_OK) {
        $error = [
            UPLOAD_ERR_INI_SIZE => 'Размер файла превысил значение upload_max_filesize в конфигурации PHP.',
            UPLOAD_ERR_FORM_SIZE => 'Размер загружаемого файла превысил значение MAX_FILE_SIZE в HTML-форме.',
            UPLOAD_ERR_PARTIAL => 'Загружаемый файл был получен только частично.',
            UPLOAD_ERR_NO_FILE => 'Файл не был загружен.',
            UPLOAD_ERR_NO_TMP_DIR => 'Отсутствует временная папка.',
            UPLOAD_ERR_CANT_WRITE => 'Не удалось записать файл на диск.',
            UPLOAD_ERR_EXTENSION => 'PHP-расширение остановило загрузку файла.',
        ];
        // Зададим неизвестную ошибку
        $unknownMessage = 'При загрузке файла произошла неизвестная ошибка.';
        // Если в массиве нет кода ошибки, скажем, что ошибка неизвестна
        $outputMessage = isset($error[$errorCode]) ? $error[$errorCode] : $unknownMessage;
        // Выведем название ошибки
        die($outputMessage);

    }

// Зададим ограничения для картинок
    $limitBytes = 1024 * 1024 * 2;
    $limitWidth = 1280;
    $limitHeight = 720;

    $image = getimagesize($filePath);   // В переменной $image массив с информацией о размерах картинки
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($fileSize > $limitBytes) {
        $error = 'Размер изображения не должен превышать 2 Мбайт.';     // Если прквышает ограничение из $limitBytes
    } elseif ($image[1] > $limitHeight) {
        $error = 'Высота изображения не должна превышать 1280 точек.';  // Если прквышает ограничение из $limitWidth
    } elseif ($image[0] > $limitWidth) {
        $error = 'Ширина изображения не должна превышать 720 точек.';   // Если прквышает ограничение из $limitHeight
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}

?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="./upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 16.08.2018 в 21:52

Неплохо) Из улучшений - можно в текстах ошибок подставлять значения переменных с максимальным размером, высотой и шириной. Переделывать не надо - просто для размышления.

artemjeka 11.09.2018 в 18:57

1.

    $fileSize = $_FILES['attachment']['size'];

    if ($fileSize > 8000000) { // ############################################ 1
        $error = 'Загрузка файлов более чем 8Мб запрещена!';
    } elseif ...

3.

    } elseif ($file['error'] === UPLOAD_ERR_INI_SIZE) { // ################### 3
        $error = 'Размер принятого файла превысил максимально допустимый размер, который задан директивой 
        upload_max_filesize конфигурационного файла php.ini.';
    } elseif ...

4.

    $fileWidth = getimagesize($file['tmp_name'])['0'];
    $fileHeight = getimagesize($file['tmp_name'])['1'];

...

    } elseif ($fileWidth > 1280 && $fileHeight > 720) { // #################### 4
        $error = 'Загрузите картинку в пределах ширины не более 1280px и высотой не более 720px! Пожалуйста)';
    } else ...
ivashkevich 22.09.2018 в 09:58

8 Мбайт это не 8000000 байт. Это 8 * 1024 * 1024.

artemjeka 08.10.2018 в 13:59

Cпасибо. Это я грубо округлил 8,388,608 байт

ivashkevich 22.09.2018 в 10:00
} elseif ($fileWidth > 1280 && $fileHeight > 720) {

тут закралась ошибка, если один из параметров будет нормальным, то второй не проверится.

artemjeka 08.10.2018 в 13:57

Надо наверно

} elseif ($fileWidth > 1280 || $fileHeight > 720) {
ivashkevich 08.10.2018 в 23:08

Верно

Benya 23.09.2018 в 11:47
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $filePatch = $file['tmp_name'];

$srcFileName = $file['name'];
$scrFileSize = $file['size'];
$fileSizeMax =  8*1024*1024;
$fileMaxWidth = 1280;
$fileMaxHeight = 720;
    $fileSizeWidthHeight = getimagesize($filePatch);
$newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if ($fileSizeWidthHeight[0] > $fileMaxHeight || $fileSizeWidthHeight[1] > $fileMaxWidth) {
        $error = 'Не допустимая ширина или высота!';
    }elseif ($scrFileSize > $fileSizeMax || ($file['error'] == UPLOAD_ERR_INI_SIZE)) {
        $error = 'Файл слишком большой!';
    }elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    }elseif ($file['error'] !== UPLOAD_ERR_OK) {
    $error = 'Ошибка при загрузке файла.';
}elseif (file_exists(($newFilePath))) {
    $error = 'Файл с таким именем существует';
}elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
    $error = "Ошибка при загрузке файла";
}else {
    $result = 'http://myproject.loc/uploads/' . $srcFileName;
}
}

?>
ivashkevich 24.09.2018 в 22:57

Хорошо! Только отступы нужно исправить, а то всё на одном уровне.

[email protected] 31.01.2020 в 18:48

тут выдает варнинг при отсутствии файла для загрузки по переменной $fileSizeWidthHeight = getimagesize($filePatch);

SBTesla 30.09.2018 в 10:55
<?php
// проверяем получение  ключевых значений
if (!empty($_FILES['attachment'] ['size'] ['tmp_name'])) {
    // Проверяем размер файла
$maxFile = 1024*1024*8;
        if($_FILES['attachment'] ['size'] > $maxFile) {
            $error = 'Файл превышает допустимый размер';
            echo $error;
 } else {
             $file = $_FILES['attachment'];
        }
        /* Определяем переменные с размерами*/
        $image = getimagesize($filePatch);
        $limitWidth = 1280;
        $limitHeight = 720;
        // Проверяем загружаемый файл на размеры
        if ($image[1] > $limitWidth) {
            $error = 'Высота изображения не должна превышать 720 точек';
        }
        if ($image[0] > $limitHeight) {
            $error = 'Ширина изображения не должна превышать 1280 точек';
        }
}

$fileName = $file['name'];
$filePatch = __DIR__ . '/fileUpload/' . $fileName;

$allowedExtension = [ 'ipg' , 'png' , 'gif'];
$extension = pathinfo($fileName, PATHINFO_EXTENSION);
if (!in_array($extension, $allowedExtension)) {
    $error = 'Загрузка фалов с таким расширением запрещена';
}

// проверяем файл ли это и временный ли он
if ($file['error'] !== UPLOAD_ERR_OK){
    $error = 'ошибка при загрузке фала';
}
elseif (file_exists($filePatch)) {
    $error = 'Файл с таким именем существует';
}elseif
     (!move_uploaded_file($file['tmp_name'], $filePatch)){
     $error = 'Ошибка при загрузке';
} else {
          $result = 'http://site/upload/fileUpload' . $fileName;
     }

?>

Только у меня вопрос по getimagesize, В официальной документации предупреждают что бы не использовать ее для проверки изображения, а использовать Fileinfo.Отсюда вопрос может я неправильно написал и есть смысл использовать проверку getimagesize после того как проверим расширение файла?

ivashkevich 30.09.2018 в 10:58

отлично!!! только дважды "http://" повторяется

SBTesla 30.09.2018 в 11:07

Поправил

stokato 05.11.2018 в 15:56

Позвольте загружать только файлы размером меньше 8Мб. Сделайте это с помощью сравнения с $_FILES['attachment']['size'].

const MAX_FILE_SIZE = 8 * 1024 * 1024;
 if($file['size'] > MAX_FILE_SIZE ) {
        $error = 'Размер файла слишком свыше 8мб!';
    }

Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].

if ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла слишком большой';
    }

Разрешите загружать картинки с шириной не более 1280px и высотой не более 720px.

const MAX_HEIGHT_SIZE_IMG = 720;
const MAX_WIDTH_SIZE_IMG = 1280;

if ($imageUploadInfo[0] > MAX_WIDTH_SIZE_IMG || $imageUploadInfo[1] > MAX_HEIGHT_SIZE_IMG) {
        $error = 'Размер изображения не должен превышать ' . MAX_WIDTH_SIZE_IMG . 'x' . MAX_HEIGHT_SIZE_IMG . '!';
    }

Весь код

<?php
const MAX_FILE_SIZE = 8 * 1024 * 1024;
const MAX_HEIGHT_SIZE_IMG = 720;
const MAX_WIDTH_SIZE_IMG = 1280;

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    $imageUploadInfo = getimagesize($file['tmp_name']);

    if($file['size'] > MAX_FILE_SIZE ) {
        $error = 'Размер файла слишком свыше 8мб!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла слишком большой';
    } elseif ($imageUploadInfo[0] > MAX_WIDTH_SIZE_IMG || $imageUploadInfo[1] > MAX_HEIGHT_SIZE_IMG) {
        $error = 'Размер изображения не должен превышать ' . MAX_WIDTH_SIZE_IMG . 'x' . MAX_HEIGHT_SIZE_IMG . '!';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 05.11.2018 в 21:51

Отлично!

virtual2018 22.11.2018 в 14:41
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>

почему в данном случае используется именно альтернативный синтаксис управляющих структур, ведь стандартная форма не намного длиннее?

ivashkevich 22.11.2018 в 22:19

На мой взгляд так в шаблонах смотрится лучше, но это вкусовщина, я не настаиваю чтобы вы писали так же.

Bogdan 30.12.2018 в 08:47

также зациклился по данному вопросу, но мне сказали что можно писать и обычно и вообще это мало когда понадобиться, а может и вовсе )

[email protected] 24.11.2018 в 11:06

У меня не работает данный скрипт из примера, пишет -

Объект не найден!
Запрашиваемый ресурс не найден. Ссылка на странице неверна или устарела. Пожалуйста, сообщите автору этой страницы об ошибке.

Если Вы считаете, что это ошибка сервера, пожалуйста, сообщите об этом веб-мастеру.

И вообще некоторые скрипты из заданий. Может быть это из-за того что я использую XAMP а не OpenServer??

virtual2018 24.11.2018 в 18:09

Вы очень мало предоставили информации по Вашей проблеме, однозначно могу сказать, что проблема не в XAMP. Рекомендую воспользоваться инструментом разработчика Хрома, чтобы определить какой именно объект не найден, а так же внимательно проверить правильно ли указано местоположение каталога uploads из задания.

ivashkevich 24.11.2018 в 21:53

В самом начале курса я предупредил, что работаем в OpenServer. Выбираете что-то другое - разбирайтесь сами.

virtual2018 24.11.2018 в 18:25
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $srcFileName = $file['name'];
    $maxFileSize = 8 * 1024 * 1024; 
    $maxWidth = 1280;
    $maxHeight = 768;
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['size'] > $maxFileSize) {
        $error = 'Размер файла превышает допустимое значение 8Mб';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла превышает допустимое значение ' . ini_get('upload_max_filesize');
    } elseif ($file['error'] == UPLOAD_ERR_PARTIAL) {
        $error = 'Файл не загрузился полностью. Повторите попытку';
    } elseif ($file['error'] == UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не удалось загрузить';
    } elseif ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Недоступна временная папка для сохранения файла';
    } elseif ($file['error'] == UPLOAD_ERR_CANT_WRITE) {
        $error = 'Ошибка записи на диск';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (getimagesize($file['tmp_name'])[0] > $maxWidth || getimagesize($file['tmp_name'])[1] > $maxHeight) {
        $error = 'Некорректное разрешение файла';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 24.11.2018 в 21:53

Отлично!

Pavel-Tonk 07.12.2018 в 23:49
$extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

я извиняюсь, но ведь переменная $srcFileName хранит имя файла, а $newFilePath - путь, но работает и с той и с той переменной функция правильно или я что-то не понял >_<.

ivashkevich 09.12.2018 в 01:16

Приведи конкретный пример с путями. Не понял пока вопроса.

Pavel-Tonk 09.12.2018 в 23:46

Во всех примерах используется данная переменная, хранящая имя файла.

$srcFileName = $file['name'];

в проверке расширения файла Вы используете её же, передавая функции pathinfo();

$extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

Хотя первым аргументом должен передаваться путь к файлу.

ivashkevich 09.12.2018 в 23:50

Имя файла - это тоже путь к файлу, просто он относительный (не полный). Получить от такого пути расширение - не проблема.

Pavel-Tonk 10.12.2018 в 00:09

Спасибо за объяснение, теперь все понятно)

Pavel-Tonk 08.12.2018 в 00:08
<?php 
if (!empty($_FILES['file'])) {
    $file = $_FILES['file'];
    $name = $file['name'];
    $tmp = $file['tmp_name'];
    $path = __DIR__.'/uploads/'.$name;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($path, PATHINFO_EXTENSION);
    $image = getimagesize($tmp);
    print_r($image);
    if ($file['error'] !== 0) {
        switch ($file['error']) {
            case 1:
            case 2:
                $error = 'Размер загружаемого файла превысил лимит';
                break;
            case 3:
            case 4:
                $error = 'Файл загружен частично или не загружен';
                break;
            case 6:
                $error = 'Отсутствует временная папка';
                break;
            case 7:
                $error = 'Не удалось записать файл на диск';
                break;
            default:
                $error = 'Ошибок не установлено';
                break;
        };
    } else if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } else if ($image['0'] !== '900' || $image['1'] !== '900') {
        $error = 'Разрешение картинки превысило допустимые';
    } else if (file_exists($path)) {
        $error = 'Файл с таким именем существует';
    } else if (!move_uploaded_file($tmp, $path)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = $path;
    }
}

как-то так.

ivashkevich 09.12.2018 в 01:17

Отличная обработка ошибок в switch-case!

Bogdan 29.12.2018 в 17:03

Позвольте загружать только файлы размером меньше 8Мб. Сделайте это с помощью сравнения с $_FILES['attachment']['size'].

$file = $_FILES['attachment'];
$maxFileSize = 8 * 1048576;

if ($file['size'] > $maxFileSize) { 
    $error = 'Превышен максимально допустимый обьем файла';
}

Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].

    $errorExeptions= ['Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.',
        'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме. ',
        'Загружаемый файл был получен только частично. ',
        'Файл не был загружен.',
        'Отсутствует временная папка. Добавлено в PHP 5.0.3. ',
        'Не удалось записать файл на диск. Добавлено в PHP 5.1.0. ',
        'PHP-расширение остановило загрузку файла. PHP не предоставляет способа определить, какое расширение остановило загрузку файла; в этом может помочь просмотр списка загруженных расширений с помощью phpinfo(). Добавлено в PHP 5.2.0. '];
$file = $_FILES['attachment'];

if (!in_array( $file['error'], $errorExeptions)){
    $index = $file['error'];
    $error = $errorExeptions[$index];
}

Разрешите загружать картинки с шириной не более 1280px и высотой не более 720px.

$file = $_FILES['attachment'];
$imageSize = getimagesize($file['tmp_name']);

if ($imageSize[0] > 1280 || $imageSize[1] > 720){
    $error = 'Высота или ширина картинки привышает допустимое ';
}
ivashkevich 01.01.2019 в 09:59

Хорошо. Вместо 1048576 лучше явно написать 1024*1024

Bogdan 02.01.2019 в 10:22

понял, спасибо, остался вопрос, на который я пока не нашел ответа

if (!in_array( $file['error'], $errorExeptions)){
    $index = $file['error'];
    $error = $errorExeptions[$index];
}

почему мы в if ставим "!", у нас же функция проверяет на совпадение и если оно есть, то выдает TRUE, а в блок if переходит при TRUE

ivashkevich 02.01.2019 в 20:57

А я не знаю, почему у Вас так написано, выглядит как ошибка. Вы проверяли код на работу перед отправкой?

Bogdan 03.01.2019 в 10:10

да, проверял, работает только когда стоит !

ivashkevich 03.01.2019 в 11:18

Подебажьте, посмотрите что не так.

o.i.popovich 08.01.2019 в 12:23

Добрый день. Подскажите как реализовать такой случай.

  • После оповещения, что Файл с таким именем уже существует, все равно его заменить.
ivashkevich 09.01.2019 в 21:29

Варианта 2:

  1. Удалить его и повторить операцию
  2. Перед копированием сразу проверить, не существует ли уже такого. Если существует, то удалить его.
N9PIX 30.01.2019 в 14:28
<?php
$allowedExtensions = ['jpg', 'png', 'gif'];
$extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
$filePath = $file['tmp_name'];
$file = $_FILES['attachment'];
if (!empty($_FILES['attachment'] ['size'] ['tmp_name'])) {
    $maxFile = 1024 * 1024 * 8;
    if ($_FILES['attachment'] ['size'] > $maxFile) {
        $error = 'Файл превышает допустимый размер';
        echo $error;
    } else {
        $file = $_FILES['attachment'];
    }
    $image = getimagesize($filePatch);
    $limitWidth = 1280;
    $limitHeight = 720;
    if ($image[1] > $limitWidth) {
        $error = 'Высота изображения не должна превышать 720 точек';
    }
    if ($image[0] > $limitHeight) {
        $error = 'Ширина изображения не должна превышать 1280 точек';
    }
}
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $sizeFiel = $file['size'];
} elseif ($file['error'] !== UPLOAD_ERR_OK) {
    $error = 'Ошибка при загрузке файла';
} elseif ($file['error'] !== UPLOAD_ERR_FORM_SIZE) {
    $error = 'Не допустимый размер файла';
} elseif ($file['error'] !== UPLOAD_ERR_PARTIAL) {
    $error = 'Файл загружен не полностью';
} elseif ($file['error'] !== UPLOAD_ERR_NO_FILE) {
    $error = 'Файл не был загружен';
} elseif ($file['error'] !== UPLOAD_ERR_NO_TMP_DIR) {
    $error = 'Отсутствует временная папка';
} elseif ($file['error'] !== UPLOAD_ERR_CANT_WRITE) {
    $error = 'Не удалось записать файл на диск';
} elseif ($file['error'] !== UPLOAD_ERR_EXTENSION) {
    $error = 'PHP-расширение остановило загрузку файла';
} elseif (file_exists($newFilePath)) {
    $error = 'Файл с таким именем уже существует';
} elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
    $error = 'Ошибка при загрузке файла';
} else {
    $result = 'http://myproject.loc/uploads/' . $srcFileName;
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
<
ivashkevich 01.02.2019 в 23:46

ОК!

tigr 30.01.2019 в 17:35

У меня почему-то коды ошибок возвращаются в цифровом формате, а не в текстовом. Можете подсказать, почему так происходит?

$file = {array} [5]
 name = "1540109472475_default.jpg"
 type = "image/jpeg"
 tmp_name = "D:\Server\OSPanel\userdata\temp\php8A67.tmp"
 error = 0
 size = 125495
ivashkevich 01.02.2019 в 23:47

Они и должны быть числами)

[email protected] 12.03.2019 в 21:42
if ($_FILES['attachment']['size'] < 80000) {
    echo $_FILES['attachment']['tmp_name'];
}
else{
    echo 'Размер файла больше 8 МБ';
}

if ($_FILES['attachment']['error'] === 1) {
    echo 'Превышен допустимый размер файла';
} else {
    echo $_FILES['attachment']['tmp_name'];

}

$allowedExtensions = ['jpg', 'png', 'gif'];
$extension = pathinfo($_FILES['attachment']['name'], PATHINFO_EXTENSION);
if (in_array($extension, $allowedExtensions)) {
    $size = getimagesize($_FILES['attachment']['tmp_name']);
    if ($size[0] < 1280 && $size[1] < 720) {
        echo 'Загрузка картинки разрешена';
    } else {
        echo 'Размеры изображения недопустимы';
    }
}
ivashkevich 14.03.2019 в 09:10

8Мб это 810241024.

[email protected] 14.03.2019 в 09:12

Но алгоритм верный?

ivashkevich 14.03.2019 в 09:18

Алгоритм в порядке, но из-за некорректного значения код работает неправильно.

ashfedor 16.03.2019 в 10:56

Становится все интересней!

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $srcFileName = $file['name']; // определяем название файла
    $fileTmp = $file['tmp_name']; // файл в временном каталоге
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName; // определяем путь сохранения файлов
    $allowedExtensions = ['jpg', 'png', 'gif']; // задаем расширения файлов на загрузку
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION); //  проверка расширения файла
    $img = getimagesize($fileTmp);

    if ($file['size'] > 8 * 1024 * 1024) { // ограничиваем размер загружаемых файлов
        $error = 'Файл больше 8mb';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) { //  проверяем может ли сервер загрузить предлагаемый размер файла
        $error = 'Ограничение размера файла на стороне сервера';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($img[0] > 1280 || $img[1] > 720){
        $error = 'Размеры сторон файла превышаеют заданные значения';
    }elseif ($file['error'] !== UPLOAD_ERR_OK) { //  проверяем на загрузуку
        $error = 'Ошибка Загрузки';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует!';

    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) { // проверяем файл в временном каталоге
    } else {
        $result = '/uploads/' . $srcFileName;// перемещаем файл по заданному адресу
    }
}
ivashkevich 17.03.2019 в 23:47

Отлично

Grewi 25.03.2019 в 01:37

Добавил функцию преобразования имени файла в более корректное и сделал вывод уже загруженных фото в каталоге.

<?php
$fileImg = ['jpg', 'png', 'gif']; //Разрешенные файлы
$fileSize = 2 * 1024 * 1024; //Максимально допустимый размер файла
$maxW = 1024; //Максимальная ширина изображения
$maxH = 1024; // Максимальная высота Изображения

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    function translit($s)
    {
        $s = (string)$s; // преобразуем в строковое значение
        $s = preg_replace("/\s+/", ' ', $s); // удаляем повторяющие пробелы
        $s = trim($s); // убираем пробелы в начале и конце строки
        $s = function_exists('mb_strtolower') ? mb_strtolower($s) : strtolower($s); // переводим строку в нижний регистр (иногда надо задать локаль)
        $s = strtr($s, array('а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'j', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'shch', 'ы' => 'y', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'ъ' => '', 'ь' => ''));
        $s = str_replace(" ", "-", $s); // заменяем пробелы знаком минус
        return $s; // возвращаем результат
    }

    $srcFileName = translit($file['name']); //С помощью фукнкции преобразуем имя файла
    $newFilePath = __DIR__ . '/upload/' . $srcFileName;
    $path_parts = pathinfo($file['name']);
    if ($file['tmp_name'] !== '') { //Если сервер не загрузил файл функции нечего проверять
        $maxSize = getimagesize($file['tmp_name']);
    }

    //Проверяем ошибки сервера
    if ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер принятого файла превысил максимально допустимый размер';
    } elseif ($file['error'] == UPLOAD_ERR_FORM_SIZE) {
        $error = 'Размер принятого файла превысил максимально допустимый размер';
    } elseif ($file['error'] == UPLOAD_ERR_PARTIAL) {
        $error = 'Файл загружен не полностью';
    } elseif ($file['error'] == UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не загружен';
    } elseif ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Отсутствует временная папка';
    } elseif ($file['error'] == UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не удалось записать файл на диск';
    } elseif ($file['error'] == UPLOAD_ERR_EXTENSION) {
        $error = 'расширение остановило загрузку файла';
    } else {

        //Если временный файл загружен делаем остальные проверки

        if ($file['size'] > $fileSize) {
            $error = 'Файл слишком большой';
        } elseif (!in_array($path_parts['extension'], $fileImg)) {
            $error = 'Недопустимый тип файла';
        } elseif ($maxSize['0'] > $maxW || $maxSize['1'] > $maxW) {
            $error = 'Максимальный размер изображения: ' . $maxW . 'px X ' . $maxH . 'px ';
        } elseif (file_exists($newFilePath)) {
            $error = 'Такой файл уже существует!';
        } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
            $error = 'Ошибка при загрузке файла';
        } else {
            $result = $newFilePath;
        }
    }
}
//Вывод изображений из upload
$dir = scandir(__DIR__ . '/upload');
$path_parts = '';
foreach ($dir as $j) {
    $a = pathinfo($j);
    if (in_array($a['extension'], $fileImg)) {
        $path_parts .= '
        <a href="/upload/' . $a['basename'] . '"><img style="height: 100px;" src="/upload/' . $a['basename'] . '" alt=""></a>';
    }
}
//Список допустимых файлов в строку
foreach ($fileImg as $i) {
    $fileImgTxt .= $i . ', ';
}
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Загрузка файлов</title>
</head>
<body>
<p style="margin: 25px 0; color: red;">К загрузке допустимы файлы: <?php echo $fileImgTxt; ?> размером не более: <?php echo $maxH; ?>
    на <?php echo $maxW; ?> пикселей. </p>
<?php if (empty($error)): ?>
    <form action="/upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="attachment">
        <input type="submit">
    </form>
<?php endif; ?>
</br></br>
<?php if (!empty($error)): ?>
    <?= $error ?> <a href="<?php echo '/upload.php' ?>">Вернуться</a>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
    </br></br>
    <a href="/upload/<?= $srcFileName ?>"><img src="/upload/<?= $srcFileName ?>" style="width: 100px;"></a>
<?php endif; ?>
<div style="margin-top: 25px;">
    <?php echo $path_parts; ?>
</div>
</body>
</html>
ivashkevich 25.03.2019 в 11:47

Не надо функции внутри условий объявлять, можно выстрелить себе в ногу.

$error = 'Такой файл уже существует!';

На самом деле не такой, а с таким же именем.

В остальном - отлично.

Grewi 25.03.2019 в 12:22

Спасибо, исправил.

<?php
$fileImg = ['jpg', 'png', 'gif']; //Разрешенные файлы
$fileSize = 2 * 1024 * 1024; //Максимально допустимый размер файла
$maxW = 1024; //Максимальная ширина изображения
$maxH = 1024; // Максимальная высота Изображения
function translit($s)
{
    $s = (string)$s; // преобразуем в строковое значение
    $s = preg_replace("/\s+/", ' ', $s); // удаляем повторяющие пробелы
    $s = trim($s); // убираем пробелы в начале и конце строки
    $s = function_exists('mb_strtolower') ? mb_strtolower($s) : strtolower($s); // переводим строку в нижний регистр (иногда надо задать локаль)
    $s = strtr($s, array('а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'j', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'shch', 'ы' => 'y', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', 'ъ' => '', 'ь' => ''));
    $s = str_replace(" ", "-", $s); // заменяем пробелы знаком минус
    return $s; // возвращаем результат
}

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $srcFileName = translit($file['name']); //С помощью фукнкции преобразуем имя файла
    $newFilePath = __DIR__ . '/upload/' . $srcFileName;
    $path_parts = pathinfo($file['name']);
    if ($file['tmp_name'] !== '') { //Если сервер не загрузил файл функции нечего проверять
        $maxSize = getimagesize($file['tmp_name']);
    }

    //Проверяем ошибки сервера
    if ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер принятого файла превысил максимально допустимый размер';
    } elseif ($file['error'] == UPLOAD_ERR_FORM_SIZE) {
        $error = 'Размер принятого файла превысил максимально допустимый размер';
    } elseif ($file['error'] == UPLOAD_ERR_PARTIAL) {
        $error = 'Файл загружен не полностью';
    } elseif ($file['error'] == UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не загружен';
    } elseif ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Отсутствует временная папка';
    } elseif ($file['error'] == UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не удалось записать файл на диск';
    } elseif ($file['error'] == UPLOAD_ERR_EXTENSION) {
        $error = 'расширение остановило загрузку файла';
    } else {

        //Если временный файл загружен делаем остальные проверки

        if ($file['size'] > $fileSize) {
            $error = 'Файл слишком большой';
        } elseif (!in_array($path_parts['extension'], $fileImg)) {
            $error = 'Недопустимый тип файла';
        } elseif ($maxSize['0'] > $maxW || $maxSize['1'] > $maxW) {
            $error = 'Максимальный размер изображения: ' . $maxW . 'px X ' . $maxH . 'px ';
        } elseif (file_exists($newFilePath)) {
            $error = 'Файл с таким именем уже существует!';
        } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
            $error = 'Ошибка при загрузке файла';
        } else {
            $result = $newFilePath;
        }
    }
}
//Вывод изображений из upload
$dir = scandir(__DIR__ . '/upload');
$path_parts = '';
foreach ($dir as $j) {
    $a = pathinfo($j);
    if (in_array($a['extension'], $fileImg)) {
        $path_parts .= '
        <a href="/upload/' . $a['basename'] . '"><img style="height: 100px;" src="/upload/' . $a['basename'] . '" alt=""></a>';
    }
}
//Список допустимых файлов в строку
foreach ($fileImg as $i) {
    $fileImgTxt .= $i . ', ';
}
?>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Загрузка файлов</title>
</head>
<body>
<p style="margin: 25px 0; color: red;">К загрузке допустимы файлы: <?php echo $fileImgTxt; ?> размером не более: <?php echo $maxH; ?>
    на <?php echo $maxW; ?> пикселей. </p>
<?php if (empty($error)): ?>
    <form action="/upload.php" method="post" enctype="multipart/form-data">
        <input type="file" name="attachment">
        <input type="submit">
    </form>
<?php endif; ?>
</br></br>
<?php if (!empty($error)): ?>
    <?= $error ?> <a href="<?php echo '/upload.php' ?>">Вернуться</a>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
    </br></br>
    <a href="/upload/<?= $srcFileName ?>"><img src="/upload/<?= $srcFileName ?>" style="width: 100px;"></a>
<?php endif; ?>
<div style="margin-top: 25px;">
    <?php echo $path_parts; ?>
</div>
</body>
</html>
ivashkevich 25.03.2019 в 12:55

Отлично

XXX 06.04.2019 в 17:01
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $maxSize = $_FILES['size'];
    $filePath = $file['tmp_name'];
    $imageSize = getimagesize($filePath);

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем существует!';
    } elseif ($_FILES['attachment']['size'] > 8 * 1024 * 1024) {
        $error = 'файл слишком болььшой';
    } elseif ($imageSize['0'] > 768 || $imageSize['1'] > 1280) {
        $error = 'Недопустумый размер изображения';
    } elseif (move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $result = 'http;//myproject.log/www/uploads' . $srcFileName;
    } else {
        $error = 'Ошибка при загрузке файла!';
    }
    /*
    elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {               // Первый вариант ошибок
    $error = 'Недопустимый размер файла.';
    } elseif ($file['error'] == UPLOAD_ERR_FORM_SIZE) {
    $error = 'Недопустимый размер файла.';
    } elseif ($file['error'] == UPLOAD_ERR_PARTIAL) {
    $error = 'Загружаемый файл был получен только частично.';
    } elseif ($file['error']== UPLOAD_ERR_NO_FILE) {
    $error = 'Файл не был загружен.';
    } elseif ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) {
    $error = 'Отсутствует временная папка.';
    } elseif ($file['error'] == UPLOAD_ERR_CANT_WRITE) {
    $error = 'Не удалось записать файл на диск.';
    } elseif ($file['error'] == UPLOAD_ERR_EXTENSION) {
    $error = 'PHP-расширение остановило загрузку файла.';
    }
    */
    switch ($file['error']) {                                     // Второй вариант ошибок
        case 1:
            $error = 'Недопустимый размер файла.';
            break;
        case 2:
            $error = 'Недопустимый размер файла.';
            break;
        case 3:
            $error = 'Загружаемый файл был получен только частично.';
            break;
        case 4:
            $error = 'Файл не был загружен.';
            break;
        case 6:
            $error = 'Отсутствует временная папка.';
            break;
        case 7:
            $error = 'Не удалось записать файл на диск.';
            break;
        case 8:
            $error = 'PHP-расширение остановило загрузку файла.';
            break;
    }

}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 06.04.2019 в 17:59

Супер! Второй вариант ошибок выглядит лучше.

polvanovv 07.04.2019 в 13:46
$srcFileName = $file['name'];
$fileResolution = getimagesize($file['tmp_name']);

1.

elseif ($file['size'] > 1024*1024*8){
        $error = 'Слишком большой размер файла.';
    }

2.

elseif ($file['error'] == UPLOAD_ERR_INI_SIZE){
        $error = 'Размер файла привышает 2Mb';
    }

3.

elseif ($fileResolution[0] > 1280 || $fileResolution[1] > 720){
        $error = 'Слишком большой размер изображения';
    }
ivashkevich 08.04.2019 в 21:37

Отлично =)

Boodoo 07.04.2019 в 21:30
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $maxWidth = 1280;
    $maxHeight = 720;
    $width = getimagesize($file['tmp_name'])[0];
    $height = getimagesize($file['tmp_name'])[1];

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif($width > $maxWidth || $height > $maxHeight) {
        $error = 'Разрешение файла превышено.';
    } elseif($file['size'] > 8388608) {
        $error = 'Размер файла должен быть не больше 8 мб.';
    } elseif ($file['error'] !== UPLOAD_ERR_INI_SIZE) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
ivashkevich 08.04.2019 в 21:39

Все хорошо, но вот такие числа - 8388608, лучше записывать в виде произведения исходных чисел (1024*1024*8), или выносить в константы с комментарием, что это за значение такое:

// 8Mb
const SIZE_LIMIT = 1024*1024*8;
Boodoo 08.04.2019 в 21:48

Ок

Dram 25.04.2019 в 17:56

Странно, куда пропадают мои ответы? Пропали более 5 комментов к прошлым урокам и я вчера на этой странице оставлял решение домашки №1 - тоже пропало.

повторяю, домашка №1

elseif ($file['size'] > 5120) {
        $error = 'Ограничение при загрузке файло - 5 кб.';
    } 
ivashkevich 25.04.2019 в 17:58

Почему не 8мб? 5кб это 5*1024

Dram 25.04.2019 в 18:00

Ну лень было картинку искать такого размера - по сути же правильно ?

ivashkevich 25.04.2019 в 18:02

Да

Dram 25.04.2019 в 18:09

№2

      elseif ($_FILES['attachment']['error']) {
        $error = 'Ограничение при загрузке файлов - блаблабла';
    }
ivashkevich 29.04.2019 в 11:27

Что ещё за блабла?

Dram 29.04.2019 в 11:29

Вы оцениваете коммент или правильность кода?

ivashkevich 29.04.2019 в 11:44

Я оцениваю в целом, годится такое решение или нет. Непонятно, что именно за ошибка произошла.

Dram 25.04.2019 в 19:35

Понимаю что задание №3 нужно делать через getimagesize но блин 3 часа убил чтобы вывести ее var_damp

<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $image = getimagesize($newFilePath);
     var_dump($image);

получаю ошибки типа
Warning: getimagesize(C:\OSPanel\domains\localhost/uploads/6a9399f6562218e96dfd352e3b3868fc.jpg): failed to open stream: No such file or directory in C:\OSPanel\domains\localhost\index.php on line 8
Что не так - не нравятся слеши в пути к картинке?

ivashkevich 29.04.2019 в 11:28

Ну так там нет ещё этого файла. Вы же его ещё не скопировали.

artemship 04.05.2019 в 13:10
<?php
if (!empty($_FILES)) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    $valueMB = 8;
    $allowedFileSize = $valueMB * 1024 * 1024;
    $allowedImageWidth = 1280;
    $allowedImageHeight = 720;

    if (file_exists($file['tmp_name'])){
        $imageParams = getimagesize($file['tmp_name']);
        $imageWidth = $imageParams[0];
        $imageHeight = $imageParams[1];
    }

    if ($file['error'] !== UPLOAD_ERR_OK) {
        switch ($file['error']) {
            case UPLOAD_ERR_INI_SIZE:
                $error = 'Размер файла превысил максимально допустимый размер в '
                    . get_cfg_var('upload_max_filesize')
                    . ', который задан директивой конфигурационного файла php.ini';
                break;
            case UPLOAD_ERR_FORM_SIZE:
                $error = 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме';
                break;
            case UPLOAD_ERR_PARTIAL:
                $error = 'Загружаемый файл был получен только частично';
                break;
            case UPLOAD_ERR_NO_FILE:
                $error = 'Файл не был загружен';
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                $error = 'Отсутствует временная папка';
                break;
            case UPLOAD_ERR_CANT_WRITE:
                $error = 'Не удалось записать файл на диск';
                break;
            case UPLOAD_ERR_EXTENSION:
                $error = 'Загрузка файла остановлена расширением';
                break;
            default:
                $error = 'Неизвестная ошибка при загрузке файла';
                break;
        }
    } elseif ($file['size'] > $allowedFileSize) {
        $error = 'Размер файла не может превышать ' . $valueMB . ' мб!';
    } elseif (!in_array(strtolower($extension), $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($imageWidth > $allowedImageWidth || $imageHeight > $allowedImageHeight) {
        $error = 'Изображение должно быть не больше, чем ' . $allowedImageWidth . 'x' . $allowedImageHeight . 'px';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует!';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузки файла!';
    } else {
        $result = 'http://phpbeg4.loc/uploads/' . $srcFileName;
    }
}
?>

<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>

getimagesize выдавал ошибку, когда нажимал "отправить", не выбрав файл. Или когда размер файла превышал заданный размер в php.ini (файл не приходил). Поэтому пришлось предварительно обернуть в условие:

    if (file_exists($file['tmp_name'])){
        $imageParams = getimagesize($file['tmp_name']);
        $imageWidth = $imageParams[0];
        $imageHeight = $imageParams[1];
    }

Но теперь PHPStorm меня предупреждает о том, что переменные $imageWidth и $imageHeight могут быть не объявлены. Можно просто проигнорировать?)
А еще функция strtolower помогла учитывать файлы, у которых расширение было прописано верхним регистром :)

ivashkevich 04.05.2019 в 14:24

Отличное домашнее задание!
А вот шторм правильно говорит. В случае, когда временного файла нет, то нужно сразу об этом написать и выдать ошибку: не удалось загрузить файл. После чего сразу завершать скрипт.

if (!file_exists($file['tmp_name'])) {
    // тут формируем ошибку и дальше уже ничего не проверяем
} else {
    // тут уже ваш код
}
artemship 04.05.2019 в 14:55

Спасибо! Вроде все понятно, но предупреждение шторма все равно осталось, т.к. переменные используются в проверке ниже (после switch):

} elseif ($imageWidth > $allowedImageWidth || $imageHeight > $allowedImageHeight) {
        $error = 'Изображение должно быть не больше, чем ' . $allowedImageWidth . 'x' . $allowedImageHeight . 'px';

И вроде никаким образом скрипт не сработает в этом месте, если файл не пришел, но шторм все равно предупреждает :D

ivashkevich 04.05.2019 в 14:59

Вот этот блок:

        $imageParams = getimagesize($file['tmp_name']);
        $imageWidth = $imageParams[0];
        $imageHeight = $imageParams[1];

Вот этот код должен быть не внутри какого-то условия. Он должен гарантированно выполниться перед if-ом, про который вы говорили.

artemship 05.05.2019 в 12:08

Разобрался, спасибо!

[email protected] 16.05.2019 в 21:47
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $filePath = $file['tmp_name'];
    $srcFileName = $file['name'];
    $image = getimagesize($filePath);
    $newFilePath = __DIR__ . '/uplode/' . $srcFileName;
    $sizeFiles = $_FILES['attachment']['size'];
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    $maxWith = 1280;
    $maxHeight = 720;
    if ($file['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'превышен размер файла';
    } else if ($file['error'] === UPLOAD_ERR_NO_FILE) {
        $error = 'файл не обнаружен';
    } else if ($file['error'] === UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'отсутствует директория для сохранения фалов';
    } else if (!in_array($extension,$allowedExtensions)) {
        $error = 'не допустимый формат';
    } else if ($image[0] > $maxHeight && $image[1] > $maxWith) {
        $error = 'недопустимые параметры изображения ширина или высота';
    } else if ($sizeFiles> 8 * 1024 * 1024) {
      $error = 'превышен размер файла';
    } else if (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = $newFilePath;
    }
}
ivashkevich 17.05.2019 в 21:46

Ок. Но elseif слитно пиши)

Moskva 11.06.2019 в 11:14
if(!empty($_FILES)){
    $file = $_FILES['attachment'];
    $sizeImage = getimagesize($file['tmp_name']);
}

1.

if ($_FILES['attachment']['size'] > 8388608){
    $error = 'Размер файла не должен превышать 8 мбайт';
}

2.

}elseif ($file['error'] !== UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла превышает 2 мб';
    }

3.

} elseif(($sizeImage[0] > 1280 ) || ($sizeImage[1] > 720)){
    $error = 'Размер изображения превышает 1280*720';
}
ivashkevich 11.06.2019 в 11:16

Отлично!

esqrx 16.06.2019 в 03:07
$fileSize = getimagesize($file['tmp_name']);

...

} elseif ($file['size'] >= 8388608){
        $error = 'Размер превышает 8M';
} elseif ($file['error'] == 1){
        $error = 'Значение: 1; Размер принятого файла и т. д.';
} elseif ($fileSize['0'] > 1280 and $fileSize['1'] > 720) {
        $error = 'Нельзя загружать картинки с шириной более 1280px и высотой более 720px';
ivashkevich 17.06.2019 в 09:58

8388608 - вот такое лучше записывать как 1024 1024 8 + выносить в константы.

$fileSize - лучше назвать imageSize, чтобы было понятнее, что там не мегабайты.

В остальном - отлично

Reechniy 15.07.2019 в 07:06
<?php
if(!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtensions = ['jpg', 'png', 'gif', 'pdf'];
    $maxSize = $file['size'];
    $limitBytes = 8*1024*1024;
    $limitWidth = 1280;
    $limitHeight = 768;
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    $filePath = $file['tmp_name'];
    $image = getimagesize($filePath);

    if ($maxSize > $limitBytes) {
        $error = 'Файл слишком большого размера';
    } elseif ($file ['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла слишком большой';
    } elseif ($image[1]>$limitHeight || $image[2]>$limitWidth) {
        $error = 'Расширение файла слишком большое';
    }
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    }
       if ($file['error'] !==UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 15.07.2019 в 08:13
$image = getimagesize($filePath);

Переменную лучше назвать imageSize.

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

В остальном отлично.

AlexxxEy 20.07.2019 в 01:43
<?php
if(!empty($_FILES)){
    var_dump($_FILES);
}
if (!empty($_FILES['attachment'])){
    $file = $_FILES['attachment'];
    $filepath = $file['tmp_name'];
    $image = getimagesize($filepath);
    $MaxWidth = 1280;
    $MaxHeight = 720;
    $srcNameFile = $file['name'];
    $newFileName = __DIR__ . '/uploads' . $srcNameFile;
$allowedExtensions = ['jpg', 'png', 'gif'];
$extension = pathinfo($srcNameFile, PATHINFO_EXTENSION);
if($file['error'] == UPLOAD_ERR_INI_SIZE){
    $error = 'Размер файла превышает 1 М';
}elseif(!in_array($extension, $allowedExtensions)){
    $error = 'Загрузка файла с таким расширением запрещена';
}elseif($file['size'] > 10 ** 8 ){
    $error = 'Размер файла превышает доступный';
}elseif($file['error']!== UPLOAD_ERR_OK){
    $error = 'Ошибка при загрузке файла';
}elseif($image > $MaxWidth || $image > $MaxHeight){
    $error = "Разрешение файла слишком велико";
}elseif(file_exists($newFileName)) {
    $error = 'Файл с таким именем уже существует';
}elseif(!move_uploaded_file($file['tmp_name'], $newFileName)){
        $error = 'Файл не найден';
    }else{
        $result = 'http://localhost/uploads/' . $srcNameFile;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if(!empty($error)): ?>
<?= $error ?>
<?php elseif(!empty($result)): ?>
<?= $result ?>
<?php endif; ?>
<form action="/uploads/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 20.07.2019 в 14:43

Всё отлично, кроме

}elseif($file['size'] > 10 ** 8 ){

Откуда это значение?

Dreft 03.09.2019 в 09:17
<?php
    if (!empty($_FILES['attachment'])) {
        $file = $_FILES['attachment'];
        $srcFileName = $file['name'];
        $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
        $maxFileSize = 1024 * 1024 * 8;
        $fileSize = $_FILES['attachment']['size'];
        $imageSize = getimagesize($file['tmp_name']);
        $maxWidth = 1280;
        $maxHeight = 720;
        $allowedExtensions = ['jpg', 'png', 'gif', 'wmv'];
        $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
        if (!in_array($extension, $allowedExtensions)) {
            $error = 'Загрузка файлов с таким расширением запрещена!';
        } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
            $error = 'Размер файла слишком большой';
        } elseif ($imageSize[0] > $maxWidth || $imageSize[1] > $maxHeight) {
            $error = 'Максимальное разрешение изображения - 1280x720 <br>
                       Текущее разрешение -  ' . $imageSize[0] . 'x' . $imageSize[1];
        } elseif ($file['error'] !== UPLOAD_ERR_OK) {
            $error = 'Ошибка при загрузке файла.';
        } elseif (file_exists($newFilePath)) {
            $error = 'Файл с таким именем уже существует';
        } elseif ($fileSize > $maxFileSize) {
            $error = 'Нельзя загружать файлы более 8МБ';
        } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
            $error = 'Ошибка при загрузке файла';
        } else {
            $result = 'http://myproject.loc/uploads/' . $srcFileName;
        }
    }
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 03.09.2019 в 09:43

Отлично

XXX 08.09.2019 в 19:43
elseif ($file['size'] > 8 * 1024 * 1024) {
    $error = 'Файл слишком большой.';
}
elseif ($file['error'] !== UPLOAD_ERR_OK) {
    switch ($file['error']) {
        case 1:
            $error = 'Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.';
            break;
        case 2:
            $error = 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.';
            break;
        case 3:
            $error = 'Загружаемый файл был получен только частично.';
            break;
        case 4:
            $error = 'Файл не был загружен.';
            break;
        case 6:
            $error = 'Отсутствует временная папка.';
            break;
        case 7:
            $error = 'Не удалось записать файл на диск..';
            break;
        case 8:
            $error = 'PHP-расширение остановило загрузку файла.';
            break;
        default:
            $error = 'Неизвестная ошибка';
    }
}
$filePath = $file['tmp_name'];
$sizeImage = getimagesize($filePath);

elseif ($sizeImage[0] > 1280 || $sizeImage[1] > 720) {
    $error = 'Недопустимые габариты изображения';
}
ivashkevich 09.09.2019 в 20:33

Отлично

Vladimir96 14.09.2019 в 04:29
<?php
    if (!empty($_FILES['attachment'])) {
        $file = $_FILES['attachment'];

        $srcFileName = $file['name'];
        $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

        $allowedExtensions = ['jpg' , 'png', 'gif'];
        $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

        $image = getimagesize($file['tmp_name']);
        $width = 1280;
        $height = 720;

        if(!in_array($extension, $allowedExtensions)){
            $error = 'Загрузка файлов с таким расширением запрещена';
        } elseif ($image[0] > $width || $image[1] > $height) {
            $error = 'Загрузите файл с расширением не более 1280x720';
        } elseif($file['error'] === 1) {
            $error = 'Загрузите на сервер файл меньше 2МБ';
        } elseif ($file['size'] > (1024 * 1024 * 8)){
            $error = 'Загрузите файл меньше 8МБ';
        } elseif($file['error'] === UPLOAD_ERR_INI_SIZE) {
            $error = ' Размер принятого файла превысил максимально допустимый размер';
        } elseif($file['error'] === UPLOAD_ERR_FORM_SIZE) {
            $error = 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.';
        } elseif($file['error'] === UPLOAD_ERR_PARTIAL) {
            $error = 'Загружаемый файл был получен только частично.';
        } elseif($file['error'] === UPLOAD_ERR_NO_FILE) {
            $error = ' Файл не был загружен.';
        } elseif($file['error'] === UPLOAD_ERR_NO_TMP_DIR) {
            $error = 'Отсутствует временная папка.';
        } elseif($file['error'] === UPLOAD_ERR_CANT_WRITE) {
            $error = 'Не удалось записать файл на диск.';
        } elseif($file['error'] === UPLOAD_ERR_EXTENSION) {
            $error = 'PHP-расширение остановило загрузку файла.';
        } elseif(file_exists($newFilePath)){
            $error = 'файл с таким именем уже существует';
        } elseif($file['error'] !== UPLOAD_ERR_OK) {
            $error = 'Ошибка при запуске файла.'; 
        } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
            $error = 'Ошибка при загрузке файла';
        } else {
            $result = 'http://textfiletwo/uploads/' . $srcFileName;
        }
    }
ivashkevich 14.09.2019 в 19:26

Отлично

Ooleg 24.09.2019 в 18:16
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    // собираем путь до нового файла - папка uploads в текущей директории
    // в качестве имени оставляем исходное файла имя во время загрузки в браузере
    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $fileSize = $file['size'];
    $allowedFileSize = 8388608;
    if (file_exists($file['tmp_name'])) {
        $fileHW = getimagesize($file['tmp_name']);
    }
    $maxFileWidth = 1280;
    $maxFileHeight = 720;

    if (!is_dir(__DIR__ . '/' . 'uploads')) {
        mkdir(__DIR__ . '/' . 'uploads');
    }

    $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким разрешением запрещена!';
    }
    elseif ($fileSize > $allowedFileSize || $file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Превышен максимальный размер файла!';
    }
    elseif ($maxFileWidth < $fileHW[0] || $maxFileHeight < $fileHW[1]) {
        $error = "Допустимое разрешение файла не больше $maxFileWidth на $maxFileHeight";
    }
    elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка призагрузке файла';
    }
    elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    }
    elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
ivashkevich 24.09.2019 в 20:20

Отлично

[email protected] 28.09.2019 в 12:49

Cтранно,я 10 раз проверил пути по которым записываю файл,но у меня он не хочет сохраняться в директории (пользуюсь убунту)


Исправил проблему изменением прав доступа у директории,в которую загружаются файлы.

ivashkevich 29.09.2019 в 12:03

Молодец)

[email protected] 28.09.2019 в 15:10

В последнем,завершённом коде,каким образом мы файл из временной директории переносим в окончательную? Из урока я понял,что нужно вызывать move_uploaded_file,но я не вижу,чтобы мы его где-то вызывали.

ivashkevich 29.09.2019 в 12:06

А ты получше посмотри) он там есть

[email protected] 29.09.2019 в 12:28

Он там есть только в виде проверки условия !move_uploaded_file($file['tmp_name']


Почитал комменты выше,понял как работает) С первого раза и не поймёшь.

dliashchenko 02.10.2019 в 22:19
<?php
if(!empty($_FILES['attachment'])) {

    $file = $_FILES['attachment'];
    $srcFileName = $file['name'];
    $srcSize = $file['size'];
    $maxSize = 8 * 1024 * 1024;
    $maxWidth = 1280;
    $maxHeight = 768;
    $filePath =  $file['tmp_name'];
    $img = getimagesize($filePath);
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtension = ['jpg', 'pdf', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if(!in_array($extension, $allowedExtension)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE){
        $error = 'Файл превысил максимально допустимый размер.';
    } elseif ($srcSize >= $maxSize) {
        $error = 'Файл не должен быть больше 8MB.';
    } elseif ($img[0] > $maxWidth && $img[1] > $maxHeight ){
        $error = 'Ширена и высота изображения привышают допустимый размер';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($filePath, $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}

Исправил.

ivashkevich 03.10.2019 в 00:43
$maxSize = 8388608

лучше представлять такие числа в виде исходных чисел (8 * 1024 * 1024), и выносить в константы. Или хотя бы комменировать. Потому что сходу непонятно, что это такое.

H3licoptero 10.10.2019 в 16:46
if (!empty($_FILES['attachment'])) {
    $file = ($_FILES['attachment']);

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtension = ['jpg', 'png', 'gif', 'JPG'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    $sizeFile = $file['size'];
    $shortTimeFile = $file['tmp_name'];
    $widthMax = 1280;
    $heightMax = 780;
    $imageResolve = getimagesize($shortTimeFile);

    if ($_FILES['attachment']['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'Превышен размер файла.';
    } elseif ($_FILES['attachment']['error'] === UPLOAD_ERR_NO_FILE) {
        $error = 'Не передан файл.';
    } elseif ($sizeFile > 1024 * 1024 * 8) {
        $error = 'Файл превышает размер по умолчанию.';
    } elseif ($imageResolve['1'] > $widthMax || $imageResolve['0'] > $heightMax) {
        $error = 'Превышено максимальное разрешение файла.';
    } elseif (!in_array($extension, $allowedExtension)) {
        $error = 'Загрузка файлов с таким расширением недоступна.';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует.';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла.';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
ivashkevich 10.10.2019 в 17:01

Супер!

eNergy 16.01.2020 в 12:50
<?php
    if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];

    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'gif', 'png'];
    $extension = pathinfo($newFilePath, PATHINFO_EXTENSION);
    $imgResolution = getimagesize($file['tmp_name']);

    if ($file['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'Превышен размер файла, установленное на сервере';
    } elseif ($file['size'] > 8388608) {
        $error = 'Файл не должен привышать 8 мегабайт';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загружать можно только изображения';
    } elseif ($imgResolution[0] > 1280 || $imgResolution[1] > 720) {
        $error = 'Размер изображения должен быть не больше 1280 на 720 пикселей';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://project.local/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
    <?php if (!empty($error)): ?>
        <?= $error ?>
    <?php elseif (!empty($result)): ?>
        <?= $result ?>
    <?php endif; ?>
<form action="/upload2.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 18.01.2020 в 07:04

8388608 - такое лучше записывать в виде 8 1024 1024

IgorG 24.01.2020 в 15:12
1) elseif ($_FILES['attachment']['size'] >= 8 * 1024 * 1024) {
       // $error = 'Файлик больше 8 мб.';
}

2) elseif ($file['error'] === UPLOAD_ERR_INI_SIZE) {
       // $error = 'Большой размер загружаемого файла (MAX 2 MB).';
}

3) $image = getimagesize($_FILES['attachment']['tmp_name']);
    $limitWidth  = 1280;
    $limitHeight = 720;

   elseif (($image[1] > $limitHeight) || ($image[0] > $limitWidth)){
        $error = 'Разрешение файла больше 1280 х 720.';
}
ivashkevich 25.01.2020 в 13:45

Отлично. Только переменной $image стоит дать более осмысленное название.

YuraG 26.01.2020 в 21:57
<?php
if (!empty($_FILES['attach'])){
    $file = $_FILES['attach'];

    $srcFileName = $file['name'];
    $newFilePath =  __DIR__. '/uploads/' . $srcFileName;
    @list($imageWidth, $imageHeight) = getimagesize($file['tmp_name']);

    $allowedExtension = ['JPG', 'png', 'gif', 'jpg'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if (!in_array($extension, $allowedExtension)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла привысил разрешенный сервером!';
    } elseif ($file['error'] != UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif ($imageWidth > 1280 || $imageHeight > 720) {
        $error = 'Файл привысил допустимую высоту или ширину !';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif ($file['size'] >= 8388608) {
        $error = 'Файл привысил допустимый размер в 8 MB ';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = __DIR__ .  DIRECTORY_SEPARATOR .'uploads' . DIRECTORY_SEPARATOR . $srcFileName;
    }
}
?>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Upload File</title>
</head>
<body>
<?php if(!empty($error)): ?>
    <?= $error ?>
<?php elseif(!empty($result)): ?>
    <a href="<?= $result ?>"><?= $srcFileName ?></a>
<?php endif; ?>
<br>
<form action=<?= $_SERVER['REQUEST_URI'] ?> method="post" enctype="multipart/form-data">
    <input type="file" name="attach">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 28.01.2020 в 18:50
@list($imageWidth, $imageHeight) = getimagesize($file['tmp_name']);

За собачек в 2020 бьют по рукам)

И на сегодняшний момент вот такой синтаксис актуален:

[$imageWidth, $imageHeight] = getimagesize($file['tmp_name']);

8388608 - вот такое в коде лучше записывать в виде 8 1024 1024 и выносить в отдельные константы.

За DIRECTORY_SEPARATOR плюсик в карму от меня :)

YuraG 28.01.2020 в 22:30

<?php
define('FILE_SIZE', (8 * 1024 * 1024));

if (!empty($_FILES['attach'])){
    $file = $_FILES['attach'];

    $srcFileName = $file['name'];
    $newFilePath =  __DIR__. '/uploads/' . $srcFileName;
    [$imageWidth, $imageHeight] = getimagesize($file['tmp_name']);

    $allowedExtension = ['JPG', 'png', 'gif', 'jpg'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if (!in_array($extension, $allowedExtension)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла привысил разрешенный сервером!';
    } elseif ($file['error'] != UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif ($imageWidth > 1280 || $imageHeight > 720) {
        $error = 'Файл привысил допустимую высоту или ширину !';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif ($file['size'] >= FILE_SIZE) {
        $error = 'Файл привысил допустимый размер в 8 MB ';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = __DIR__ .  DIRECTORY_SEPARATOR .'uploads' . DIRECTORY_SEPARATOR . $srcFileName;
    }
}
?>

[$imageWidth, $imageHeight] = getimagesize($file['tmp_name']);
вот тут получаю иногда: Warning: getimagesize(): Filename cannot be empty in upload.php on line 9
когда файл не грузится из - за ошибок при загрузке $_FILES['attach']['error']. Мне так кажется.
Как правильно обработать такой случай?
ivashkevich 29.01.2020 в 06:27

Значит сначала нужно обработать эту ошибку, а потом уже пытаться узнать размер действительно существующего файла.

Salexandr 04.02.2020 в 00:30
$fileTmpName = $file['tmp_name'];
$imageSize = getimagesize($fileTmpName);

    if ($file['size'] >= 8 * 1024 * 1024) {
        $error = 'Загружаемый файл не должен превышать 8 Мб';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла больше значения upload_max_filesize в php.ini';
    } elseif ($imageSize[1] > 768 || $imageSize[0] > 1280) {
        $error = 'Разрешение изображения не должно превышать 1280х768';
ivashkevich 04.02.2020 в 13:18

Отлично

[email protected] 22.03.2020 в 15:17

Первое задание:

elseif ($file['size'] > 8 * 1024 * 1024) {
        $error = 'Размер загружаемого файла больше 8 МБ.';
    }

Второе задание:

elseif ($file['error'] === 1) {
        $error = 'Размер принятого файла превысил максимально допустимый размер.';
    }

Третье задание:

    $sizeImage = getimagesize($file['tmp_name']);
      elseif ($sizeImage['0'] > 1280 || $sizeImage['1'] > 720) {
        $error = 'Ширина или высота изображения больше 1280px или 780px соответственно';
    }

Но не могу понять с 3-им заданием. При загрузке изображения с шириной и высотой больше указанных, пишется сообщение об ошибке, но всё равно файл загружается в папку. Такого же не должно быть?

ivashkevich 22.03.2020 в 17:50

Смотря о какой папке речь. О временной, или о папке, в которую мы в итоге картинки сохраняем?

[email protected] 22.03.2020 в 18:06

В папку uploads, в которую мы в итоге картинки сохраняем.

ivashkevich 22.03.2020 в 18:08

Ну конечно это неправильно) Разбирайтесь с отладчиком, что не так

[email protected] 22.03.2020 в 18:29

Разобрался всё-таки))
Было:

    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла!!!';
    } elseif ($sizeImage['0'] > 1280 || $sizeImage['1'] > 720) {
        $error = 'Ширина или высота изображения больше 1280px или 780px соответственно';
    }

Стало:

    } elseif ($sizeImage['0'] > 1280 || $sizeImage['1'] > 720) {
        $error = 'Ширина или высота изображения больше 1280px или 780px соответственно';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) { //функция загрузки и проверки файла
        $error = 'Ошибка при загрузке файла!!!';
    }

Теперь не загружает того, чего не надо))

[email protected] 31.03.2020 в 22:08
<?
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '\upload' . $srcFileName;
    $fileSize = $file['size'];
    $limitBytes  = 1024 * 1024 * 8;
    $limitWidth  = 1280;
    $limitHeight = 768;
    $filePath = $file['tmp_name'];
    $image = getimagesize($filePath);

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if ($fileSize > $limitBytes) {
        $error = 'Размер файла слишком большой';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла слишком большой';
    } elseif ($image[1] > $limitHeight || $image[0] > $limitWidth){
        $error = 'Привышенно допустимое разрешение картинки';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($filePath, $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/upload/upload.php' . $srcFileName;
    }
}
?>
ivashkevich 01.04.2020 в 04:41

Отлично

[email protected] 09.04.2020 в 10:41
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/upload/' . $srcFileName;
    $allowedExtentions = ['gif', 'png', 'jpg'];
    $extention = pathinfo($newFilePath, PATHINFO_EXTENSION);
    $fileSize = $file['size'] / 1024 ** 2;
    $imageSize = getimagesize($file['tmp_name']);

    if(!in_array($extention, $allowedExtentions)) {
      $error = 'Недопустимое расширение файла';
    }  else {
      if($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла';
      }
      elseif($imageSize[0] > 1200 || $imageSize[1] > 720) {
        $error = "Превышены допустимые размеры изображения";
      }
      elseif($fileSize > 8){
        $error = 'Превышен допустимый размер файла';
      }
      elseif(file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
      } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
          $error = 'Ошибка при загрузке файла';
      } else {
          $result = 'http://myproject.loc/upload/' . $srcFileName;
      }
    }

}
?>
ivashkevich 09.04.2020 в 10:50

Отлично!

studentDev 12.04.2020 в 15:32
<?php
        if(isset($_FILES)) {
            $file = $_FILES['attachment'];
            $fileName = $file['name'];
            $fileDir = __DIR__ . '/uploads/' . $fileName;
            $fileTmp = $_FILES['attachment']['tmp_name'];
            $maxWidthImage = 1024;
            $maxHeightImage = 400;
            $sizeInMb = 8;
            $size = $sizeInMb * 1024 * 1024;

            $allowed = ['png', 'jpg', 'gif', 'mp3'];
            $lookFormat = pathinfo($fileName, PATHINFO_EXTENSION);

            $image = @getimagesize($fileTmp);

            if (!in_array($lookFormat, $allowed)) {
                $error = 'Ошибка, разрешены только форматы .jpg .png .gif !';
            } elseif($image[0] > $maxWidthImage || $image[1] > $maxHeightImage) {
                $error = 'Недопустимое разрешение изображения!';
            } elseif ($file['size'] > $size) {
                $error = 'Этот файл больше 8 мб!';
            } elseif ($file['error'] === 1) {
                $error = 'Ваша файл слишком велик!';
            } elseif ($file['error'] === 2) {
                $error = 'Ваш файл превысил размер стандартного значения!';
            } elseif ($file['error'] === 3) {
                $error = 'Файл был загружен частично!';
            } elseif ($file['error'] === 4) {
                $error = 'Файл не был загружен, попробуйте ещё раз!';
            } elseif ($file['error'] === 6) {
                $error = 'Отсутствует временная папка на сервере, обратитесь в тех. поддержку!';
            } elseif ($file['error'] === 7) {
                $error = 'Не удалось записать файл на диск сервера!';
            } elseif ($file['error'] == 8) {
                $error = 'Ошибка сервера!';
            } elseif (file_exists($fileDir)) {
                $error = 'Файл с таким именем ' . $fileName . ' существует!';
            } elseif (!move_uploaded_file($file['tmp_name'], $fileDir)) {
                $error = 'Файл не загружен...';
            } else {
                $result = 'http://upload.com/uploads' . $fileName;
            }
        }

Я прописал подавление ошибки у функции getimagesize(), потому что меня ругали что имя файла не может быть пустым (filename cannot be empty), я уже пытался самостоятельно создавать временный файл и нечего не получилось :(
Есть ли какие-нибудь способы устранение данной ошибки?

ivashkevich 13.04.2020 в 14:42

По коду всё ок, с ошибкой такой ранее не сталкивался, погуглите

[email protected] 14.04.2020 в 08:57

Позвольте загружать только файлы размером меньше 8Мб. Сделайте это с помощью сравнения с $_FILES['attachment']['size'].

Добавил

if ($file['size'] > 8 * 1024 * 1024) {
        $error = 'Файл слишком большой!';

Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].

Не увидел особой необходимости в этой проверке, если мы контролируем размер файла, как в первом задании.
Единственный вариант применения, который пришел в голову, - если мы пока что не знаем, что задано в php.ini. Поэтому:

if ($file['size'] > 8 * 1024 * 1024) {
        $error = 'Файл слишком большой!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Я то согласен, что файл небольшой, а вот сервер считает иначе <br> Обратитесь к администратору сервера!';

В целом обработчик ошибок у меня выглядит так:

//Обрабатываем ошибки:
    if ($file['size'] > 8 * 1024 * 1024) {
        $error = 'Файл слишком большой!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Я то согласен, что файл небольшой, а вот сервер считает иначе <br> Обратитесь к администратору сервера!';
    } elseif ($file['error'] == UPLOAD_ERR_PARTIAL) {
        $error = 'В процессе передачи часть файла потерялась! Попробуйте еще раз...';
    } elseif ($file['error'] == UPLOAD_ERR_NO_FILE) {
        $error = 'Не удалось загрузить файл. Он точно есть там, откуда Вы его грузите?';
    } elseif ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Не вижу временную папку для загрузки. С сервером и правами доступа все ок?';
    } elseif ($file['error'] == UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не получилось записать файл на сервер. С сервером и правами доступа все ок?';
    } elseif ($file['error'] == UPLOAD_ERR_EXTENSION) {
        $error = 'Веб-мастер добаловался с расширениями PHP, какое-то из них мешает загрузить файл :(';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }

Разрешите загружать картинки с шириной не более 1280px и высотой не более 720px.

$file = $_FILES['attachment'];
$srcFileName = $file['name'];
$newFilePath = __DIR__ . '/uploads/' . $srcFileName;
$size = getimagesize($newFilePath);
if ($size[0] > 1280 or $size[1] > 720) {
$error = 'Разрешено загружать картинки размером не более чем 1280х720.<br>Проверьте размер загружаемой картинки и попробуйте еще раз';
}
ivashkevich 14.04.2020 в 19:30

Отлично!

Fill 14.04.2020 в 12:45
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['JPG', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    //получаем ширину и высоту изображения
    $imgWidth = getimagesize($file['tmp_name'])['0'];
    $imgHeight = getimagesize($file['tmp_name'])['1'];
    //получаем размер файла
    $fileSize = $_FILES['attachment']['size'];

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
        //проверка на размер файла по ограничению сервер, в php.ini менял на 2М и вернул на 50М
    } elseif ($file['error'] == 1) {
        $error = 'Ошабка при загрузке файла, на сервере разрешены файлы не больше 50 МБ';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
        //проверка на размер файла
    } elseif ($fileSize > 8388608) {
        $error = 'Ошабка при загрузке файла, файл , больше 8 МБ';
        //проверка на ширину изображения
    } elseif ($imgWidth > 1280) {
        $error = 'Ошибка при загрузке файла, ширина изображения больше 1280';
        //проверка на высоту изображения
    } elseif ($imgHeight > 720) {
        $error = 'Ошибка при загрузке файла, высота изображения больше 720';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
ivashkevich 14.04.2020 в 19:41

Отлично

X-Nick 17.04.2020 в 23:29
<?php
    if(!empty($_FILES)) {
        $attachment = $_FILES['attachment'];
        $path = __DIR__.'/uploads';
        $newFile = $path.'/'.$attachment['name'];
        $allowedExtensions = ['jpg', 'jpeg'];
        $extension = pathinfo($attachment['name'], PATHINFO_EXTENSION);
        $size = getimagesize($attachment['tmp_name']);
            switch($attachment['error']) {
                case UPLOAD_ERR_INI_SIZE:
                    $error = "The uploaded file exceeds the upload_max_filesize directive in php.ini";
                    break;
                case UPLOAD_ERR_FORM_SIZE:
                    $error = "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form";
                    break;
                case UPLOAD_ERR_PARTIAL:
                    $error = "The uploaded file was only partially uploaded";
                    break;
                case UPLOAD_ERR_NO_FILE:
                    $error = "No file was uploaded";
                    break;
                case UPLOAD_ERR_NO_TMP_DIR:
                    $error = "Missing a temporary folder";
                    break;
                case UPLOAD_ERR_CANT_WRITE:
                    $error = "Failed to write file to disk";
                    break;
                case UPLOAD_ERR_EXTENSION:
                    $error = "File upload stopped by extension";
                    break;
                case UPLOAD_ERR_OK:
                    if(file_exists($newFile)) {
                        $error = 'File '.$attachment['name'].' is already in UPLOADS folder';
                        break;
                    }
                    elseif (!in_array($extension, $allowedExtensions)) {
                        $error = 'File extension is not allowed';
                        break;
                    }
                    elseif ($attachment['size'] > 8388608) {
                        $error = 'File size cannot be more than 8MB';
                        break;
                    }
                    elseif ($size[0] > 1280 || $size[1] > 720) {
                        $error = 'Image size cannot be more than 1024*720 px';
                        break;
                    }
                    else {
                        move_uploaded_file($attachment['tmp_name'], $newFile);
                        $loadedFileAddress = 'http://localhost:63342/upload/uploads/'.$attachment['name'];
                        break;
                    }

                default:
                    $error = "Unknown upload error";
                    break;
            }
    }
    else {
        $error = 'Choose a file and press the SUBMIT button';
    }

?>
<html lang="">
<head>
    <title>Files upload</title>
</head>
<body>
<?php
if (isset($loadedFileAddress)) {
    echo '<a href ='.$loadedFileAddress.'>Loaded file is here</a>';
}
elseif (isset($error)) {
    echo $error;
}
?>
<form action="upload.php" method = "post" enctype="multipart/form-data">
<label>
    File:
</label>
    <input type = file name="attachment">
    <input type="submit" value="SIBMIT">
</form>
</body>
</html>
ivashkevich 18.04.2020 в 06:12

Всё ок, кроме форматирования. Ну и вот тут дичь какая-то: http://localhost:63342/upload/uploads/

Вы что, до сих пор не настроили веб-сервер? С дебаггером тоже не работали до сих пор?

X-Nick 18.04.2020 в 11:47

кроме форматирования

PSR? Вижу только в нескольких местах между if и открывающей скобкой нет пробела.

Ну и вот тут дичь какая-то: http://localhost:63342/upload/uploads/

У меня на каждый урок отдельный домен. Открываю странички из шторма, поэтому через внутренний сервер. Чтобы не настраивать каждый раз деплоймент в шторме, использую стандартные настройки. Хотя согласен, нужно привыкать делать правильно. Уже переделал)

О каких настройках веб-сервера речь?
Дебаггер без проблем работает, только какое он имеет отношение к этому?

Еще и ошибку нашел)):

$extension = pathinfo($attachment['name'], PATHINFO_EXTENSION);
$size = getimagesize($attachment['tmp_name']);

Нужно сделать как-то так:

$extension = !empty($attachment['name']) ? pathinfo($attachment['name'], PATHINFO_EXTENSION) : null;
$size = !empty($attachment['tmp_name']) ? getimagesize($attachment['tmp_name']) : null;

а далее уже провеверять, если не нулл

elseif ($extension !== null && !in_array($extension, $allowedExtensions)) {
    $error = 'File extension is not allowed';
    break;
}
elseif ($size !== null && $size[0] > 1280 || $size[1] > 720) {
    $error = 'Image size cannot be more than 1024*720 px';
    break;
}
ivashkevich 18.04.2020 в 20:01

Вижу только в нескольких местах между if и открывающей скобкой нет пробела.

А должны быть! И свитч ещё уехал.

У меня на каждый урок отдельный домен.

А не проще файлики просто разные в одном проекте создавать.

О каких настройках веб-сервера речь?

О PHP в связке с Apache, а не штормовском "веб-сервере".

а далее уже провеверять, если не нулл

А откуда там нулл возьмётся?

X-Nick 18.04.2020 в 21:07

О PHP в связке с Apache, а не штормовском "веб-сервере".

Все что делали в рамках уроках - настроено и даже больше.

А откуда там нулл возьмётся?

Я же его туда и установливаю, если там нет значения:

$size = !empty($attachment['tmp_name']) ? getimagesize($attachment['tmp_name']) : null;
ivashkevich 19.04.2020 в 15:31

Я имел в виду, для чего вы это делаете? С чего взяли, что там может быть empty?

X-Nick 19.04.2020 в 16:51

Когда например нажимаем кнопку отправить, но файл не был выбран. Или по другому можно делать инициализацию этих переменных не в начале скрипта, а уже в конкретных условиях, где проверяется расширение и разрешение соответственно.

ivashkevich 19.04.2020 в 17:12

Если файл не был выбран самая первая проверка не выполнится

if(!empty($_FILES))
Timurik 18.04.2020 в 12:16

У меня получилось как-то так:

<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif']; //Разрешенные расширение
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    $maxSize = 8388608; //Максимальный размер в байтах

    $maxWidth = 1280; //Максимальная ширина
    $maxHeight = 720; //Максимальная высота

    $heightWidth = getimagesize($file['tmp_name']); //Параметры картинки
    $fileWidth = $heightWidth[0]; //Ширина файла
    $fileHeight = $heightWidth[1]; //Высота файла

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла привышает заданный в upload_max_filesize.';
    } elseif ($file['error'] === UPLOAD_ERR_FORM_SIZE) {
        $error = 'Размер файла привышает заданный в MAX_FILE_SIZE.';
    } elseif ($file['error'] === UPLOAD_ERR_PARTIAL) {
        $error = 'Загружаемый файл был получен только частично.';
    } elseif ($file['error'] === UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не был загружен.';
    } elseif ($file['error'] === UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Отсутствует временная папка.';
    } elseif ($file['error'] === UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не удалось записать файл на диск.';
    } elseif ($file['error'] === UPLOAD_ERR_EXTENSION) {
        $error = 'PHP-расширение остановило загрузку файла.';
    } elseif ($file['size'] > $maxSize) {
        $error = 'Размер файла больше разрешенного.';
    } elseif ($fileWidth > $maxWidth) {
        $error = 'Ширина больше разрешенной.';
    } elseif ($fileHeight > $maxHeight) {
        $error = 'Высота больше разрешенной.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 18.04.2020 в 20:03
$maxSize = 8388608;

Лучше представить как количество мегабайт, умноженное на количество килобайт в мегабайте, умноженное на количество байт в килобайте.

В остальном ОК.

Timurik 18.04.2020 в 21:13

так:

$maxSize = 8*1024*1024; //Максимальный размер в байтах

или лучше так:

$maxSize = 8*(2^10)*(2^10); //Максимальный размер в байтах
ivashkevich 19.04.2020 в 15:31

Первый вариант)

[email protected] 19.04.2020 в 19:15

После часа мучений вроде получилось)

<?php
$allowedExtensions = ['jpg', 'png', 'jpeg', 'gif', 'PNG', 'JPG'];
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $fileName = $file['name'];
    $filePath = __DIR__ . '/uploads/' . $fileName;
    $extension = pathinfo($fileName, PATHINFO_EXTENSION);
    $size = getimagesize($file['tmp_name']);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Uploading files with this ' . $extension . 'extension is prohibited!';
    } elseif ($file['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'Change conf of php.ini, variable - upload_max_filesize';
    } elseif ($size[0] >= 1280 || $size[1] >= 720) {
        $error = 'Width or height of image are too BIG!';
    } elseif ($file['size'] > 8192000) {
        $error = 'Too big, > 8Mb!';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Error uploading file';
    } elseif (file_exists($filePath)) {
        $error = 'File already exists, man!';
    } elseif (!move_uploaded_file($file['tmp_name'], $filePath)) {
        $error = 'A VERY BIG ERROR';
    } else {
        $result = 'File is successfully written by a path: uploads/' . $fileName;
    }
}
?>
<html>
<head>
    <title>Upload window</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit" value="Approve downloading">
</form>
</body>
</html>
ivashkevich 19.04.2020 в 19:44

8192000 лучше записать как 8*1024*1024

n.yurasheva 21.04.2020 в 18:40
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $srcFileName = $file['name'];
    $file['tmp_name'] == '' ? $error = 'Картинка не выбрана' : $imgWidthHeight = getimagesize($file['tmp_name']);
    if (empty($error)) {
        $newFilePath = __DIR__ . '\uploads\\' . $srcFileName;
        $allowedExtensions = ['jpg', 'png', 'gif'];
        $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
        if (!in_array($extension, $allowedExtensions)) {
            $error = 'Загрузка файлов с таким расширением запрещена!';
        } elseif ($file['error'] !== UPLOAD_ERR_OK) {
            $error = 'Ошибка при загрузке файла.';
        } elseif (file_exists($newFilePath)) {
            $error = 'Файл с таким именем уже существует';
        } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
            $error = 'Ошибка при загрузке файла';
        } elseif ($file['size'] > 8388608) {
            $error = 'Размер файла должен быть меньше 8Мб';
        } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
            $error = 'Размер файла превысил максимально допустимый размер';
        } elseif ($imgWidthHeight[0] > 1280 || $imgWidthHeight[1] > 720) {
            $error = 'Ширина должны быть не более 1280px, а высота - не более 720px.';
        } else {
            $result = 'uploads\\' . $srcFileName;
        }
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 21.04.2020 в 19:00
    $file['tmp_name'] == '' ? $error = 'Картинка не выбрана' : $imgWidthHeight = getimagesize($file['tmp_name']);

Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.

        $newFilePath = __DIR__ . '\uploads\\' . $srcFileName;

Лучше использовать обычные слеши вместо обратных, не будет проблем при переходе на Linux.

8388608 лучше записать как 8 * 1024 * 1024

В остальном ОК.

[email protected] 30.04.2020 в 11:55
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    $size = $_FILES['attachment']['size'];
    $limitWidth = 1280;
    $limitHeight = 720;
    $imageSize = getimagesize($file['tmp_name']);

    if ($imageSize[0] > $limitWidth || $imageSize[1] > $limitHeight) {
        $error = 'Превышена ширина или высота загружаемого файла';
    } elseif ($size > 8388608) {
        $error = 'Превышен размер загружаемого файла';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] === UPLOAD_ERR_INI_SIZE || $file['error'] === UPLOAD_ERR_FORM_SIZE) {
        $error = 'Размер загружаемого файла превысил максимальное значение';
    } elseif ($file['error'] === UPLOAD_ERR_PARTIAL) {
        $error = 'Загружаемый файл был получен только частично';
    } elseif ($file['error'] === UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не был загружен';
    } elseif ($file['error'] === UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Отсутствует временная папка';
    } elseif ($file['error'] === UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не удалось записать файл на диск';
    } elseif ($file['error'] === UPLOAD_ERR_EXTENSION) {
        $error = 'PHP-расширение остановило загрузку файла';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://localhost/test/uploads/' . $srcFileName;
    }
}
ivashkevich 30.04.2020 в 19:03

8388608 лучше записать как 8 * 1024 * 1024

В остальном отлично

happyviolence 30.04.2020 в 18:59

ставлю в дз ограничение 8 Мб, файлы не загружаются, но не из-за моего ограничения, а хз почему. в консоли выводится warning о том что файл превышает 8 Мб, но при этом в php.ini ограничение установлено на 2 Мб. Где может быть вообще еще это ограничение и как в php.ini его поменять, если линукс не дает сохранить изменения, файл доступен только для чтения?

ivashkevich 30.04.2020 в 19:17

В какой консоли?

happyviolence 30.04.2020 в 20:07

ой, то есть в терминале выводится: PHP Warning: POST Content-Length of 10885169 bytes exceeds the limit of 8388608 bytes in Unknown on line 0

ivashkevich 01.05.2020 в 14:59

Как вы оказались в терминале, если речь шла о запуске скрипта через веб?

happyviolence 01.05.2020 в 15:42

я в терминале запускаю команду php -s localhost:8000 для запуска сервера. Далее в браузере загружаю файл размером более 8 Мб через форму согласно кода с урока. Файл не загружается, но ошибка ,прописанная мной в коде, не выводится, в терминале выводится PHP Warning: POST Content-Length of 10885169 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
Всё, разобралась. Проблема была в том, что в php.ini по умолчанию был установлен post_max_size = 8 Мб. Извиняюсь, что побеспокоила.

ivashkevich 02.05.2020 в 06:56

Почему не пользуешься нормальным веб-сервером? Отладчик тоже не настраивала?

titelivus 03.05.2020 в 14:04
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif', 'pdf'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    $allowedSize = 8 * 1024 * 1024;
    $allowedImageSize = [1280, 720];
    $uploadImageSize = getimagesize($file['tmp_name']);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        // upload_max_filesize = 2M в php.ini
        $error = 'Размер принятого файла превысил максимально допустимый размер 2МБ.';
    } elseif ($file['size'] > $allowedSize) {
        // Это условие не нужно, но оставил его для ответа на первую задачу.
        $error = 'Размер файла должен быть меньше 8 мб!';
    } elseif ($uploadImageSize['0'] > $allowedSize['0']
        || $uploadImageSize['1'] > $allowedSize['1']) {
        $error = 'Ширина изображения не должна превышать 1200px и высоту 720px!';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 03.05.2020 в 21:01

Супер

titelivus 04.05.2020 в 10:29

Почему имя файла написанный кириллицей сохраняется с кракозябрами?)

ivashkevich 06.05.2020 в 13:31

Видимо с кодировкой проблемы

NR 14.05.2020 в 00:44
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES ['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $fileSize = $file['size'];
    $fileTmp = $file ['tmp_name'];
    $imageSize = getimagesize ($fileTmp);
    $limitWidth  = 1280;
    $limitHeight = 720;
    $limitBytes = 8 * 1024 * 1024;
    $allowedExtensions = ['JPG', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if (empty ($srcFileName)) {
        $error = 'Пожалуйста, выберите файл.';
    } elseif ($imageSize > $limitHeight) {
        $error = 'Высота изображения не должна превышать 720px.';
    } elseif ($imageSize > $limitWidth) {
        $error = 'Ширина изображения не должна превышать 1280px.';
    // Установите значение upload_max_filesize в файле php.ini, равное 2M
    } elseif ($file['error'] = UPLOAD_ERR_INI_SIZE) {
        $error = 'Загружаемый файл не может превышать 2 МБ';

    // Позвольте загружать только файлы размером меньше 8Мб.
    } elseif ($fileSize > $limitBytes) {
        $error = 'Загружаемый файл не может превышать 8МБ.';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error']!== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует.';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла.';
    } else {
        $result = 'http://myproject.loc/index.php/uploads/' . $srcFileName;
    }
}
?>

<html>
<head>
    <title>upload</title>
</head>
<body>
<?php if(!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 14.05.2020 в 13:10

Отлично!

IePyton 18.05.2020 в 17:36
<?php
if (!empty($_FILES['attachment'])) {

    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = 'uploads/' . $srcFileName;

    $allowedExtension = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    $maxFileSize = 8000000;
    $uploadFileSize = $file['size'];

    $parametrs = getimagesize($file['tmp_name']);

    if ($parametrs[0] > 1280 || $parametrs[1] > 720) {
        $error = 'Размеры изображения превышают 1280х720';
    } elseif ($file['error'] == 1) {
        $error = 'Размер загружаемого файла больше допустимого';
    } elseif ($uploadFileSize > $maxFileSize) {
        $error = 'Размер загружаемого файла больше допустимого';
    } elseif (!in_array($extension, $allowedExtension)) {
        $error = 'Загрузка файла с таким разрешением запрещена';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка загрузки файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка загрузки файла';
    } else {
        $result = 'http://localhost:8888/phplearn.my/' . $newFilePath;
    }

}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>

<br>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">

</form>
</body>
</html>
ivashkevich 19.05.2020 в 06:07
    $maxFileSize = 8000000;

Это не 8 Мб

        $result = 'http://localhost:8888/phplearn.my/' . $newFilePath;

Это ещё что за зверь? Дебаггером есть возможность пользоваться?

IePyton 19.05.2020 в 09:36
$maxFileSize = 8*1024*1024;

Это ещё что за зверь? Дебаггером есть возможность пользоваться?

это у меня через MAMP сайты с локального сервера по такому урлу открываются. xDebug работает (но чтобы он заработал нужно было совершить танец с бубном)))

[email protected] 20.05.2020 в 17:08

У меня все время выдает ошибки. Ошибка при загрузке файла. Невозможно переместить файл. Файл не найден.

ivashkevich 20.05.2020 в 18:41

Какой у вас сервер? Дебажить пробовали?

[email protected] 06.06.2020 в 22:57

1

if ($file['size'] > 8388608) {
        $error = 'Загрузка файлов более 8 мб запрещена!';

2

if ($file['error'] === 1) {
        $error = 'Загрузка файлов более 2 мб запрещена!';

3

  $widthWeight = getimagesize($newFilePath);
 if($widthWeight[0] > 1280 || $widthWeight[1] > 720){
        $error = 'Можно загружать картинки с шириной не более 1280px и высотой не более 720px';
    }

А вот задача конечно ступорит.

ivashkevich 07.06.2020 в 13:03

8388608 лучше записать как 8 * 1024 * 1024

Задача на ваше усмотрение остаётся

[email protected] 08.06.2020 в 21:29

Действительно хочу сделать домашку, но не могу понять условие.
Если разъясните, буду признаетелен...

Следующая строка содержит число элементов в комбинации (k).
1 ≤ k ≤ количество elements
ivashkevich 09.06.2020 в 12:48

Число комбинаций (k) может быть от нуля до числа, равному количеству элементов

Hellbound 12.06.2020 в 16:56
<?php
if (!empty($_FILES)) {
    $file = $_FILES['attachment'];

    $imageSizeArray = getimagesize($file['tmp_name']);
    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if ($imageSizeArray[0] > 1280 || $imageSizeArray[1] > 720) {
        $error = 'Ошибка, картинка слишком большая';
    } elseif ($file['error'] == 1) {
        $error = 'Ошибка, размер файла превышает разрешенный (2МБ)';
    } elseif ($file['size'] > 8*1024*1024) {
        $error = 'Ошибка, размер файла слишком большой';
    } elseif (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
echo $file['error'];
?>

У меня почему-то ошибки в браузере не выводятся, хотя в .ini я поставил display_errors = On и error_reporting = E_ALL. Также пробовал в самом коде прописывать error_reporting(E_ALL); и ini_set("display_errors", 1);. Да и если убрать в коде вот эту часть

elseif ($file['size'] > 8*1024*1024) {
        $error = 'Ошибка, размер файла слишком большой';
    }

то файлы выше 8 МБ грузятся без проблем и значение error в массиве равно 0, хотя в .ini файле у меня upload_max_filesize = 2M. Не могу понять в чем дело

Задачу пока не решил

ivashkevich 13.06.2020 в 09:06

Привет! А сервер перезапускал после изменения php.ini? Файл точно сохранил?

У меня почему-то ошибки в браузере не выводятся

О каких конкретно ошибках речь?

Hellbound 13.06.2020 в 15:36

Да, файл я сохранил и перезапустил, потом опять открывал и проверил, изменения сохранились

  • О каких конкретно ошибках речь?

Ну, я просто подумал, что вот здесь

Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].

при превышении разрешенного размера должна выводиться какая-то ошибка. Если это не так, то прошу прощения, немного глупый. Но у меня также не выводилась ошибка из урока про подключение файлов (когда подключаемый файл не находится директивами require и include). Хотя тогда я был еще на PHP 7.0, может в этом дело. Но сейчас я точно менял ini файл 7.4

ivashkevich 14.06.2020 в 13:29

Ну это не ошибка программы, а просто текст ошибки, который мы сформировали.

Да, у каждой версии PHP свой php.ini, при переключении нужно вносить изменения заново.

Hellbound 14.06.2020 в 19:47

С выводом ошибок я наконец-то смог совладать.

Да, про текст я понял, просто думал, что если не прописывать код, обрабатывающий ошибку, то вылезет какая-нибудь ошибка по типу тех же из урока про подключение файлов. Но я все еще не понимаю, почему файл грузится, хотя превышает размер, написанный в php.ini. И судя по всему, из-за этого же значение error в массиве $_FILES у меня всегда 0. Или так и должно быть? Извиняюсь, конечно, что так прикопался, просто в документации простенькое описание, что эта директива отвечает за максимальный размер закачиваемого файла, а нагуглить внятно ничего не смог.

ivashkevich 15.06.2020 в 20:39

В выводе phpinfo() какое значение у этой директивы?

Hellbound 18.06.2020 в 23:51

50M

ivashkevich 19.06.2020 в 07:38

Ну, значит не там поменяли) Посмотрите, может там еще одна такая же строка, но с другим значением?

Hellbound 19.06.2020 в 13:05

Но проблема в том, что я не только в ini файле пытался менять, но и в самом коде прописывать как ini_set('upload_max_filesize', '2M'), но значение error так же равно 0 при загрузке файла весом 11 МБ. Нашел примерно такой же вопрос на stackoverflow, но там как раз советуют написать в коде ini_set(). Пока больших проблем это не приносит, так что оставлю как есть, наверное.

VitaliyB 25.07.2020 в 10:04
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $maxSize = $_FILES ['attachment']['size'];
    $imageSize = getimagesize($newFilePath);
    $imageWidth = 1024;
    $imageHeight = 780;
    $limitSize = 1024 * 1024 * 8;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } elseif ($maxSize > $limitSize) {
        $error = 'Файл превышает допустимого';
    } elseif ($imageSize ['0'] > $imageWidth || $imageSize['1'] > $imageHeight) {
        $error = 'Размер катинки превышает допустимых 1024 на 780';
    } else {
        $result = 'http://myproject.loc/addfileinserver/uploads/' . $srcFileName;
    }
}
ivashkevich 25.07.2020 в 19:46
$imageWidth лучше назвать $maxImageWidth, так как это не ширина текущего изображения, а максимальная. С высотой аналогично. В остальном норм.
dimadima 05.09.2020 в 13:10
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    // собираем путь до нового файла - папка uploads в текущей директории
    // в качестве имени оставляем исходное файла имя во время загрузки в браузере
    $srcFileName = $file['name'];
    $srcFileSize = $file['size'];

    ini_set(upload_max_filesize, '2M');
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    $pixel = getimagesize ($file);
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ( $srcFileSize !== ini_set('post_max_size', '8M')) {
        $error = 'Максимальный размер привышен';

    }elseif ($pixel[0] < 1280 && $pixel[1] < 720 ){
        $error = 'Привышено значение пикселей';
    }elseif ( $file['error'] !== UPLOAD_ERR_INI_SIZE) {
        $error ='Опять максимальный размер';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
ivashkevich 06.09.2020 в 14:34

Закрывающий тег ?> в конце файла не нужен.

В остальном - ОК

CTALb 30.09.2020 в 15:25

Мучался несколько дней, но задачу с нахождением комбинаций так и не осилил.

ivashkevich 01.10.2020 в 19:02

Ну пропустите пока

X-Nick 02.10.2020 в 14:27

1.Подскажите, где на сервере правильно размещать папки с картинками и JS скриптами? На одном уровне с пабликом?

2.Папка public_html является какой то особенной для сервера, что ее видно наружу?

3.Что еще кроме точки входа можно показывать наружу?

ivashkevich 06.10.2020 в 07:44
  1. Да
  2. Погуглите что такое корневая директория для сайта
  3. Статические файлы, к которым нужен доступ для пользователей
X-Nick 08.10.2020 в 10:36

Я все это уже прогуглил, но ответов на вопросы не убавилось, а наоборот.
Например:
При размещении js скриптов в папке на одном уровне с пабликом, уже даже сама IDE ругается на то, что не может найти эти файлы. После перемещения этой папки со скриптами внутрь папки public_html все начинает работать. Вот это и непонятно.

Файл htaccess лежит в паблике. Но зачем пользователям иметь доступ к этому файлу?

И в целом - что значит доступ пользователей? Т.е. любой пользователь может иметь доступ к индексному файлу? Или речь о доступе только на исполнение файла? Кто определяет уровень этого доступа? Это определяется настройками хостера?

ivashkevich 12.10.2020 в 07:31

Нужно в IDE значит указать корневую директорию веб-сервера. А вообще на эти ее "ругательства" можно забить.

Пользователям не нужно иметь доступ к .htaccess, это конфигурация apache для конкретной директории.

X-Nick 12.10.2020 в 10:53

Нужно в IDE значит указать корневую директорию веб-сервера. А вообще на эти ее "ругательства" можно забить.

Так если бы вопрос был ТОЛЬКО в IDE, то можно было и забить. В самом браузере(разные пробовал) то тоже не работает, когда картинки/скрипты не внутри паблика.
Я не знаю, может это какие-то настройки сервера влияют на это..

Пользователям не нужно иметь доступ к .htaccess, это конфигурация apache для конкретной директории.

В курсах по ООП .htaccess лежит же рядом с index.php

Ну и с вот этим тогда не понятно:

3.Что еще кроме точки входа можно показывать наружу?

3.Статические файлы, к которым нужен доступ для пользователей

Те же картинки(например аватарки) - это же статические файлы и к ним нужен доступ пользователей? Если должны быть общедоступны, то должны быть внутри паблик папки, а не на одном уровне?

ivashkevich 15.10.2020 в 12:17

В самом браузере(разные пробовал) то тоже не работает, когда картинки/скрипты не внутри паблика.

Они должны быть исключительно внутри паблика. Создайте рядом с index.php отдельную папку uploads или img и складывайте туда то, к чему должен быть доступ из браузера)

MikeSiebel 13.10.2020 в 11:52

Добрый день! Все пункты задания получились. Попробовал ещё дополнительную проверку 'Размер загружаемого файла указанный в HTML-форме(UPLOAD_ERR_FORM_SIZE). Это не получилось. Подскажите, пожалуйста, что не так, и нужна ли эта проверка.

<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $scrFileSize = $file['size'];
    $maxFileSize =  8*1024*1024;
    $maxFileWidth = 1280;
    $maxFileHeight = 720;
    $filePath = $file['tmp_name'];
    $image = getimagesize($filePath);
    var_dump($image);
    $maxImageWidth = 1280;
    $maxImageHeight = 720;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($scrFileSize > $maxFileSize) {
        $error = 'Размер загружаемого файла превысил допустимое значение';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер принятого файла превысил размер, который задан в файле php.ini.';

        //следующая проверка у меня не работает
    } elseif ($file['error'] == UPLOAD_ERR_FORM_SIZE) {
        $error = 'Размер загружаемого файла превысил значение, указанное в HTML-форме.';

    }else if ($image['0'] > $maxImageWidth || $image['1'] > $maxImageHeight) {
            $error = 'Запрещено загружать картинки с шириной более 1280px или высотой более 720px';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://localhost/ws_lessons/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head><body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/ws_lessons/upload.php/" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="hidden" name="MAX_FILE_SIZE" value="8388608"><!--задаём макс. размер из формы-->
    <input type="submit">
</form>
</body>
</html>
ivashkevich 15.10.2020 в 12:22

Такая проверка не имеет смысла. Проверка на сервере должна быть обязательно, по желанию - на стороне клиента.

[email protected] 03.11.2020 в 00:00

Не могу разобраться, загружаю файл больше 8Мб, указал проверку, но этот файл даже не проверяется алгоритмом, просто перезагружается страница, будто я ничего не загружал.

Смотрел через дебаггер, попадает на строчку

if (!empty($_FILES['attachment'])) 

и после неё сразу на html часть, как-будто ничего не передается в $_FILES.

Как это победить?
Может ли это быть из-за post_max_size с параметром в 8Мб?

ivashkevich 03.11.2020 в 18:02

Да, может

pixel 09.11.2020 в 23:15

Возник вопрос почему getimagesize не работает с $file['name']
С другими заданиями разобрался.

<?php
    function resolution(array $resolution): bool
    {
        $width = 1280;
        $height = 720;
        if ($resolution[0] < $width || $resolution[1] < $height) {
            return true;
        } else return false;
    }
$resolution = getimagesize($file['tmp_name']);
if (resolution($resolution) === false) {
    $error = 'Превышено допустимое разрешение картинки с шириной не более 1280px и высотой не более 720px';
    }
ivashkevich 10.11.2020 в 19:18

Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L

Всегда используйте фигурные скобки для блоков if-else.

Возник вопрос почему getimagesize не работает с $file['name']

Рекомендую ознакомиться с другими решениями в комментариях.

Larisa 14.11.2020 в 17:08
<?php

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    $sizeFile = $file['size'];
    $limitSize = 1024 * 1024 * 8;
    $limitWidth = 1280;
    $limitHeight = 720;
    $image = getimagesize($file['tmp_name']);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    } elseif ($sizeFile > $limitSize) {
        $error = 'Размер файла превысил 8 МБ';
    } elseif ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла превысил 8 МБ';
    } elseif ($image[1] > $limitHeight || $image[0] > $limitWidth) {
        $error = 'Рисунок превысил размер';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла';
    } elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://localhost:63342/study/uploads/' . $srcFileName;
    }
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/study/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 15.11.2020 в 12:50

Супер!

[email protected] 17.11.2020 в 16:16

получилось так, после всех манипуляций:

<?php
//if (!empty($_FILES)) {
//    var_dump($_FILES);
//}
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $sizeFile = getimagesize($newFilePath);
    //var_dump($sizeFile) ;
    $allowedExtensions = ['jpeg', 'jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    }elseif ($file['size'] >= 8000000) {
        $error = 'Ошибка размера при загрузке файла.';
    }elseif ($file['error'] === 1) {
        $error = 'Размер загружаемого файла больше разрешенного в php.ini';
    }elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    }  elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif ($sizeFile['0'] > 1280) {
        $error = 'Ширина файла больше 1280px.';
    } elseif ($sizeFile['1'] > 720) {
        $error = 'Высота файла больше 720px.';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}

?>

<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 17.11.2020 в 17:22

8000000 - что за магическое число?)

Deo 23.11.2020 в 14:08

Чёт я в самом начале материала застрял - Ошибка при загрузке файла.
Фот мой upload.php

<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    // собираем путь до нового файла - папка uploads в текущей директории
    // в качестве имени оставляем исходное файла имя во время загрузки в браузере
    $srcFileName = $file['logo.gif']; // ЭТО СТРОКА 7
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    if (!move_uploaded_file($file['tmp__name'], $newFilePath)) { // ЭТО СТРОКА 10
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}
?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>

Вот вывод в браузере
описание картинки

ivashkevich 23.11.2020 в 17:47

Ну написано что на 7 строке в массиве $file нет ключа logo.gif. Собственно, почему он там должен быть? Для чего так написали?)

Deo 23.11.2020 в 18:24

А, ну понял, что 'name' надо так и оставить - ключ, а не задавать значение.
Теперь вроде заработало.

ivashkevich 24.11.2020 в 10:11

Ну вы отладчиком посмотрите что в этом массиве есть, чтобы не наугад писать)

GeoOK 21.12.2020 в 16:26

Здравствуйте! Проверьте пожалуйста, все ли верно?

<?php
if (!empty($_FILES)) {
    $file = $_FILES['attachment'];
    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;
    $allowedExtensions = ['jpg', 'png', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);
    $size = $file['size'];
    $errorList = [
        1 => 'Код ошибки = 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini',
        2 => 'Код ошибки = 2; Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме',
        3 => 'Код ошибки = 3; Загружаемый файл был получен только частично',
        4 => 'Код ошибки = 4; Файл не был загружен',
        6 => 'Код ошибки = 6; Отсутствует временная папка',
        7 => 'Код ошибки = 7; Не удалось записать файл на диск',
        8 => 'Код ошибки = 8; PHP-расширение остановило загрузку файла. PHP не предоставляет способа определить, какое расширение остановило загрузку файла'
    ];
    $imageInfo = getimagesize($file['tmp_name']);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена';
    } elseif ($size > 8192000) {
        $error = 'Загрузка файлов более 8 Мб запрещена';
    } elseif
    ($file['error'] !== UPLOAD_ERR_OK) {
        $error = $errorList[$file['error']];
    } elseif
    (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif ($imageInfo[0] > 1280 || $imageInfo[1] > 720) {
        $error = 'Загрузка картинок размером более 1280 х 720 запрещена';
    } elseif
    (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://diskstation/uploads/' . $srcFileName;
    }
}
?>
ivashkevich 23.12.2020 в 07:23

Да, отлично. Единственное, ограничение на размер я бы записал как 810241024, так нагляднее

GeoOK 23.12.2020 в 11:02

Понял. Спасибо! Учту на будущее.

Egor.Ka 24.02.2021 в 18:27
<?php
if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];
    var_dump($_FILES);

    // собираем путь до нового файла - папка uploads в текущей директории
    // в качестве имени оставляем исходное файла имя во время загрузки в браузере
    $srcFileName = $file['name'];
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName;

    list($width, $height) = getimagesize($file['tmp_name']);
    var_dump($width, $height);

    $allowedExtensions = ['JPG', 'PNG', 'gif'];
    $extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

    if (!in_array($extension, $allowedExtensions)) {
        $error = 'Загрузка файлов с таким расширением запрещена!';
    }elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла.';
    }elseif ($width  > 1280 && $height  > 720) {
        $error = 'Разрешение картинки с шириной более 1280px и высотой более 720px запрещено .';
    }elseif ($file['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер принятого файла превысил допустимый размер ';
    }elseif ($file['size'] > 8388608) {
        $error = 'Размер принятого файла превысил допустимый размер 8МБ';
    }elseif ($file['error'] === UPLOAD_ERR_PARTIAL) {
        $error = 'Загружаемый файл был получен только частично.';
    }elseif ($file['error'] === UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не был загружен.';
    }elseif ($file['error'] === UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Отсутствует временная папка';
    }elseif ($file['error'] === UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не удалось записать файл на диск';
    }elseif ($file['error'] === UPLOAD_ERR_EXTENSION) {
        $error = 'PHP-расширение остановило загрузку файла.';
    }elseif (file_exists($newFilePath)) {
        $error = 'Файл с таким именем уже существует';
    } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
        $error = 'Ошибка при загрузке файла';
    } else {
        $result = 'http://myproject.loc/uploads/' . $srcFileName;
    }
}

?>
<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <?= $error ?>
<?php elseif (!empty($result)): ?>
    <?= $result ?>
<?php endif; ?>
<br>
<form action="/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="attachment">
    <input type="submit">
</form>
</body>
</html>
ivashkevich 28.02.2021 в 06:07
    $allowedExtensions = ['JPG', 'PNG', 'gif'];

Лучше сделать в одном регистре, и при сравнении с расширением файла приводить к тому же регистру.

ivashkevich 28.02.2021 в 06:08

8388608 лучше записать как 102410248

Vladimir96 06.03.2021 в 17:53

Дополнил код к существующему

    $sizeForCheck = 8388608;
    $imgInfo = getimagesize($file['tmp_name']);

    $width = $imgInfo[0];
    $height = $imgInfo[1];

    if ($sizeForCheck < $file['size']) {
        $error = 'Большой файл';
    } elseif ($width > 1280 || $height > 720) {
        $error = 'Загрузите изображение 1280/720 пикселей либо меньше';
    } elseif ($file['error'] === UPLOAD_ERR_INI_SIZE) {
        $error = 'Файл больше допустимого';
    }
ivashkevich 10.03.2021 в 18:58

Отлично

Sergey503 28.03.2021 в 19:21

"Позвольте загружать только файлы размером меньше 8Мб".
Как то так.

<?php

if (!empty($_FILES['attachment'])) {
    $file = $_FILES['attachment'];

    $srcFileName = $file['name']; // название файла
    $newFilePath = __DIR__ . '/uploads/' . $srcFileName; // путь сохранения файлов
    $allowedExtensions = ['jpg', 'png', 'gif']; // указаны расширения на загрузку
    $extension = pathinfo($newFilePath, PATHINFO_EXTENSION); // проверка расширения файла
    $limitBytes = 8 * 1000 * 1000; // размер загружаемых файлов
    $fileSize = $file['size'];
    $limitWidth = 1280; // Максимальная ширина
    $limitHeight = 720; // Максимальная высота
    if ($file['tmp_name'] !== '') { // Если файла нет, проверять нечего
        $image = getimagesize($file['tmp_name']); // файл во временном каталоге
    }

    // Ошибки сервера
    if ($file['error'] == UPLOAD_ERR_INI_SIZE) {
        $error = 'Размер файла максимально превысил допустимый размер - php.ini upload_max_filesize';
    } elseif ($file['error'] == UPLOAD_ERR_FORM_SIZE) {
        $error = 'Размер файла максимально превысил допустимый размер';
    } elseif ($file['error'] == UPLOAD_ERR_PARTIAL) {
        $error = 'Загружаемый файл был получен частично';
    } elseif ($file['error'] == UPLOAD_ERR_NO_FILE) {
        $error = 'Файл не был загружен';
    } elseif ($file['error'] == UPLOAD_ERR_NO_TMP_DIR) {
        $error = 'Отсутствует временная папка.';
    } elseif ($file['error'] !== UPLOAD_ERR_OK) {
        $error = 'Ошибка при загрузке файла';
    } elseif ($file['error'] == UPLOAD_ERR_CANT_WRITE) {
        $error = 'Не удалось записать файл на диск.';
    } elseif ($file['error'] == UPLOAD_ERR_EXTENSION) {
        $error = 'расширение остановило загрузку файла';
    } else

        // Если временный файл был загружен, выполняются проверки.
        if ($fileSize > $limitBytes) {
            $error = 'Превышен максимально допустимый размер файла';
        } elseif ($image[0] > $limitWidth || $image[1] > $limitHeight) {
            $error = 'Превышен допустимый размер картинки';
        } elseif (!in_array($extension, $allowedExtensions)) {
            $error = 'Загрузка файлов с таким расширением запрещена!';
        } elseif (file_exists($newFilePath)) {
            $error = 'Файл с таким именем уже существует';
        } elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) {
            $error = 'Ошибка при загрузке файла';
        } else {
            $result = $newFilePath;
        }
}
?>
ivashkevich 04.04.2021 в 16:12

Супер!

serega19860511 03.05.2021 в 22:20
$validExtensions = ['jpg', 'png', 'gif'];

if (!empty($_FILES)) {
    $file = $_FILES['attachment'];
    $fileName = $file['name'];
    $newPathFile = __DIR__ . '/uploades/' . $fileName;
    $extensions = pathinfo($newPathFile, PATHINFO_EXTENSION);
    $maxWidth = 1280;
    $maxHeight = 720;
    if (!empty($file['tmp_name'])) {
        $imageSize = getimagesize($file['tmp_name']);
    }

    if (!in_array($extensions, $validExtensions)) {
        $error = 'не допустимое расширение файла';
    } else if ($imageSize[0] > $maxWidth or $imageSize[1] > $maxHeight) {
        $error = 'ширина или высота картинки слишком большая';
    } else if (file_exists($newPathFile)) {
        $error = 'файл с таким именем уже существует';
    } else if ($file['error'] === 1) {
        $error = 'превышен размер файла';
    } else if ($file['error'] === 2) {
        $error = 'превышен размер файла';
    } else if ($file['error'] === 3) {
        $error = 'Загружаемый файл не был получен полностью';
    } else if ($file['error'] === 4) {
        $error = 'Файл не был загружен';
    } else if (!move_uploaded_file($file['tmp_name'], $newPathFile)) {
        $error = 'ошибка загрузки';
    } else {
        $message = true;
    }
}
?>

<html>
<head>
    <title>Загрузка файла</title>
</head>
<body>
<?php if (!empty($error)): ?>
    <h3><?= $error ?></h3>
<?php elseif ($message): ?>
    <img src="/uploades/<?= $fileName ?>">
<?php else: ?>
    <form action="/upload.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="8000000"/>
        <input type="file" name="attachment">
        <input type="submit">
    </form>
<?php endif; ?>
</body>
</html>

Если я форме через скрытый инпут провалидировал размер файла, считается ли это корректной проверкой?

ivashkevich 19.05.2021 в 21:15

Нет. Этот скрытый инпут можно в браузере вертеть как душе угодно

Логические задачи с собеседований