Чат Telegram
Группа ВКонтакте
Новый комментарий


fantasyz
$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

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

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

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

fantasyz

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

ivashkevich

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

fantasyz

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

Bogdan
$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

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

1nSide

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

<?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

Отлично! :)

Nikolas

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

ivashkevich

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

Fox-24

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

<?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

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

ArtemijeKA

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

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

ArtemijeKA

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

ivashkevich
} elseif ($fileWidth > 1280 && $fileHeight > 720) {

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

ArtemijeKA

Надо наверно

} elseif ($fileWidth > 1280 || $fileHeight > 720) {
ivashkevich

Верно

Benya
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

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

SBTesla
<?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

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

SBTesla

Поправил

demyanovpaul@yandex.ru

Позвольте загружать только файлы размером меньше 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

Отлично!

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

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

ivashkevich

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

Bogdan

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

lig7771991@list.ru

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

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

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

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

virtual2018

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

ivashkevich

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

virtual2018
<?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

Отлично!

Pavel-Tonk
$extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

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

ivashkevich

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

Pavel-Tonk

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

$srcFileName = $file['name'];

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

$extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

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

ivashkevich

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

Pavel-Tonk

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

Pavel-Tonk
<?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

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

Bogdan

Позвольте загружать только файлы размером меньше 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

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

Bogdan

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

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

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

ivashkevich

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

Bogdan

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

ivashkevich

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

o.i.popovich

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

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

Варианта 2:

  1. Удалить его и повторить операцию
  2. Перед копированием сразу проверить, не существует ли уже такого. Если существует, то удалить его.
N9PIX
<?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

ОК!

tigr

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

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

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

babls2332@gmail.com
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

8Мб это 810241024.

babls2332@gmail.com

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

ivashkevich

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

ashfedor

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

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

Отлично

Grewi

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

<?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

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

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

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

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

Grewi

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

<?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

Отлично

XXX
<?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

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

polvanovv
$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

Отлично =)

Boodoo
<?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

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

// 8Mb
const SIZE_LIMIT = 1024*1024*8;
Boodoo

Ок

Dram

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

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

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

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

Dram

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

Dram

№2

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

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

Dram

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

ivashkevich

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

Dram

Понимаю что задание №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

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

artemship
<?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

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

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

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

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

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

ivashkevich

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

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

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

artemship

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

krollik1000000@gmail.com
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

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

Moskva
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

Отлично!

esqrx
$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

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

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

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

Reechniy
<?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
$image = getimagesize($filePath);

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

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

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

AlexxxEy
<?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

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

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

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

Dreft
<?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

Отлично

XXX
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

Отлично

Vladimir96
<?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

Отлично

Ooleg
<?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

Отлично

prinzplanloser0514@gmail.com

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


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

ivashkevich

Молодец)

prinzplanloser0514@gmail.com

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

ivashkevich

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

prinzplanloser0514@gmail.com

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


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

dliashchenko
<?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
$maxSize = 8388608

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

H3licoptero
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

Супер!

Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований