Этот урок набрал набрал достаточно большое количество
комментариев и дальнейшее его комментирование отключено.
Если вы хотели убедиться в правильности выполнения ДЗ или у вас возник вопрос по уроку,
посмотрите ранее добавленные комментарии, кликнув по кнопке ниже. Скорее всего вы найдете там то, что искали.
Если это не помогло - задайте вопрос в чате в телеграме - https://t.me/php_zone
Замечание по первому заданию - 8МБ это всё-таки 8 * 1024 * 1024. Можно прямо так в коде и записать.
А в третьем задании стоит воспользоваться функцией getimagesize(), она более надёжна, так как позволяет узнать размеры картинки на стороне сервера. Кроме того, она может вернуть false, что будет говорить о том, что картинка мягко говоря "неправильная". Цифры в вашем примере пришли из браузера - это менее надежно. Они могут прийти от клиента какими угодно. А могут и вовсе не прийти, и тогда будет warning, так как ключей 0 и 1 в массиве не окажется.
так я же применяю функцию getimagesize() к временному файлу вот тут $image = getimagesize($filePath); и беру из полученого массива соответствующие данные для сравнения с задаными
$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... или я что-то перепутал?
если не выбрать файл и нажать 'Отправить', будет ошибка.
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
Или это только у меня так?
у меня вопрос, проверка условия if (!move_uploaded_file($file['tmp_name'], $newFilePath)) и сразу выполнит саму функцию move_uploaded_file и использует ее же в проверке условия?Мне казалось,что нужно ее сначала выполнить,после чего она вернет true или false и только потом использовать ее в проверке условия?
Да, отработает именно так, как вы и написали. Сначала выполнится и вернёт результат, который сразу будет проверен в условии. Можно и в переменную положить, $isUploaded, например, а затем проверять её.
Неплохо) Из улучшений - можно в текстах ошибок подставлять значения переменных с максимальным размером, высотой и шириной. Переделывать не надо - просто для размышления.
} elseif ($fileWidth > 1280 && $fileHeight > 720) { // #################### 4
$error = 'Загрузите картинку в пределах ширины не более 1280px и высотой не более 720px! Пожалуйста)';
} else ...
<?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 после того как проверим расширение файла?
Изучите директиву 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 . '!';
}
Вы очень мало предоставили информации по Вашей проблеме, однозначно могу сказать, что проблема не в XAMP. Рекомендую воспользоваться инструментом разработчика Хрома, чтобы определить какой именно объект не найден, а так же внимательно проверить правильно ли указано местоположение каталога uploads из задания.
я извиняюсь, но ведь переменная $srcFileName хранит имя файла, а $newFilePath - путь, но работает и с той и с той переменной функция правильно или я что-то не понял >_<.
Изучите директиву 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 = 'Высота или ширина картинки привышает допустимое ';
}
Все хорошо, но вот такие числа - 8388608, лучше записывать в виде произведения исходных чисел (1024*1024*8), или выносить в константы с комментарием, что это за значение такое:
получаю ошибки типа
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
Что не так - не нравятся слеши в пути к картинке?
<?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 (файл не приходил). Поэтому пришлось предварительно обернуть в условие:
Но теперь PHPStorm меня предупреждает о том, что переменные $imageWidth и $imageHeight могут быть не объявлены. Можно просто проигнорировать?)
А еще функция strtolower помогла учитывать файлы, у которых расширение было прописано верхним регистром :)
Отличное домашнее задание!
А вот шторм правильно говорит. В случае, когда временного файла нет, то нужно сразу об этом написать и выдать ошибку: не удалось загрузить файл. После чего сразу завершать скрипт.
if (!file_exists($file['tmp_name'])) {
// тут формируем ошибку и дальше уже ничего не проверяем
} else {
// тут уже ваш код
}
} elseif ($file['size'] >= 8388608){
$error = 'Размер превышает 8M';
} elseif ($file['error'] == 1){
$error = 'Значение: 1; Размер принятого файла и т. д.';
} elseif ($fileSize['0'] > 1280 and $fileSize['1'] > 720) {
$error = 'Нельзя загружать картинки с шириной более 1280px и высотой более 720px';
В последнем,завершённом коде,каким образом мы файл из временной директории переносим в окончательную? Из урока я понял,что нужно вызывать move_uploaded_file,но я не вижу,чтобы мы его где-то вызывали.
лучше представлять такие числа в виде исходных чисел (8 * 1024 * 1024), и выносить в константы. Или хотя бы комменировать. Потому что сходу непонятно, что это такое.
$sizeImage = getimagesize($file['tmp_name']);
elseif ($sizeImage['0'] > 1280 || $sizeImage['1'] > 720) {
$error = 'Ширина или высота изображения больше 1280px или 780px соответственно';
}
Но не могу понять с 3-им заданием. При загрузке изображения с шириной и высотой больше указанных, пишется сообщение об ошибке, но всё равно файл загружается в папку. Такого же не должно быть?
Я прописал подавление ошибки у функции getimagesize(), потому что меня ругали что имя файла не может быть пустым (filename cannot be empty), я уже пытался самостоятельно создавать временный файл и нечего не получилось :(
Есть ли какие-нибудь способы устранение данной ошибки?
Позвольте загружать только файлы размером меньше 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>Проверьте размер загружаемой картинки и попробуйте еще раз';
}
<?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;
}
}
У меня на каждый урок отдельный домен. Открываю странички из шторма, поэтому через внутренний сервер. Чтобы не настраивать каждый раз деплоймент в шторме, использую стандартные настройки. Хотя согласен, нужно привыкать делать правильно. Уже переделал)
О каких настройках веб-сервера речь?
Дебаггер без проблем работает, только какое он имеет отношение к этому?
Когда например нажимаем кнопку отправить, но файл не был выбран. Или по другому можно делать инициализацию этих переменных не в начале скрипта, а уже в конкретных условиях, где проверяется расширение и разрешение соответственно.
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
ставлю в дз ограничение 8 Мб, файлы не загружаются, но не из-за моего ограничения, а хз почему. в консоли выводится warning о том что файл превышает 8 Мб, но при этом в php.ini ограничение установлено на 2 Мб. Где может быть вообще еще это ограничение и как в php.ini его поменять, если линукс не дает сохранить изменения, файл доступен только для чтения?
я в терминале запускаю команду 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 Мб. Извиняюсь, что побеспокоила.
Это ещё что за зверь? Дебаггером есть возможность пользоваться?
это у меня через MAMP сайты с локального сервера по такому урлу открываются. xDebug работает (но чтобы он заработал нужно было совершить танец с бубном)))
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';
}
<?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. Не могу понять в чем дело
Да, файл я сохранил и перезапустил, потом опять открывал и проверил, изменения сохранились
О каких конкретно ошибках речь?
Ну, я просто подумал, что вот здесь
Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].
при превышении разрешенного размера должна выводиться какая-то ошибка. Если это не так, то прошу прощения, немного глупый. Но у меня также не выводилась ошибка из урока про подключение файлов (когда подключаемый файл не находится директивами require и include). Хотя тогда я был еще на PHP 7.0, может в этом дело. Но сейчас я точно менял ini файл 7.4
Да, про текст я понял, просто думал, что если не прописывать код, обрабатывающий ошибку, то вылезет какая-нибудь ошибка по типу тех же из урока про подключение файлов. Но я все еще не понимаю, почему файл грузится, хотя превышает размер, написанный в php.ini. И судя по всему, из-за этого же значение error в массиве $_FILES у меня всегда 0. Или так и должно быть? Извиняюсь, конечно, что так прикопался, просто в документации простенькое описание, что эта директива отвечает за максимальный размер закачиваемого файла, а нагуглить внятно ничего не смог.
Но проблема в том, что я не только в ini файле пытался менять, но и в самом коде прописывать как ini_set('upload_max_filesize', '2M'), но значение error так же равно 0 при загрузке файла весом 11 МБ. Нашел примерно такой же вопрос на stackoverflow, но там как раз советуют написать в коде ini_set(). Пока больших проблем это не приносит, так что оставлю как есть, наверное.
Я все это уже прогуглил, но ответов на вопросы не убавилось, а наоборот.
Например:
При размещении js скриптов в папке на одном уровне с пабликом, уже даже сама IDE ругается на то, что не может найти эти файлы. После перемещения этой папки со скриптами внутрь папки public_html все начинает работать. Вот это и непонятно.
Файл htaccess лежит в паблике. Но зачем пользователям иметь доступ к этому файлу?
И в целом - что значит доступ пользователей? Т.е. любой пользователь может иметь доступ к индексному файлу? Или речь о доступе только на исполнение файла? Кто определяет уровень этого доступа? Это определяется настройками хостера?
Нужно в IDE значит указать корневую директорию веб-сервера. А вообще на эти ее "ругательства" можно забить.
Так если бы вопрос был ТОЛЬКО в IDE, то можно было и забить. В самом браузере(разные пробовал) то тоже не работает, когда картинки/скрипты не внутри паблика.
Я не знаю, может это какие-то настройки сервера влияют на это..
Пользователям не нужно иметь доступ к .htaccess, это конфигурация apache для конкретной директории.
В курсах по ООП .htaccess лежит же рядом с index.php
Ну и с вот этим тогда не понятно:
3.Что еще кроме точки входа можно показывать наружу?
3.Статические файлы, к которым нужен доступ для пользователей
Те же картинки(например аватарки) - это же статические файлы и к ним нужен доступ пользователей? Если должны быть общедоступны, то должны быть внутри паблик папки, а не на одном уровне?
В самом браузере(разные пробовал) то тоже не работает, когда картинки/скрипты не внутри паблика.
Они должны быть исключительно внутри паблика. Создайте рядом с index.php отдельную папку uploads или img и складывайте туда то, к чему должен быть доступ из браузера)
Добрый день! Все пункты задания получились. Попробовал ещё дополнительную проверку 'Размер загружаемого файла указанный в 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>
Не могу разобраться, загружаю файл больше 8Мб, указал проверку, но этот файл даже не проверяется алгоритмом, просто перезагружается страница, будто я ничего не загружал.
Смотрел через дебаггер, попадает на строчку
if (!empty($_FILES['attachment']))
и после неё сразу на html часть, как-будто ничего не передается в $_FILES.
Как это победить?
Может ли это быть из-за post_max_size с параметром в 8Мб?
Возник вопрос почему 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';
}
1.
2.
3.
Очень хорошо!
Замечание по первому заданию - 8МБ это всё-таки 8 * 1024 * 1024. Можно прямо так в коде и записать.
А в третьем задании стоит воспользоваться функцией getimagesize(), она более надёжна, так как позволяет узнать размеры картинки на стороне сервера. Кроме того, она может вернуть false, что будет говорить о том, что картинка мягко говоря "неправильная". Цифры в вашем примере пришли из браузера - это менее надежно. Они могут прийти от клиента какими угодно. А могут и вовсе не прийти, и тогда будет warning, так как ключей 0 и 1 в массиве не окажется.
так я же применяю функцию getimagesize() к временному файлу вот тут $image = getimagesize($filePath); и беру из полученого массива соответствующие данные для сравнения с задаными
Прошу прощения, не увидел. Тогда всё отлично. Единственное - переменную лучше назвать $imageSize.
Спасибо, исправлю)
Видимо и правда ошибка
Перепутал width с height, а height с width.
Почитал разобрался)
Отлично! :)
если не выбрать файл и нажать 'Отправить', будет ошибка.
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
Или это только у меня так?
у меня вопрос, проверка условия if (!move_uploaded_file($file['tmp_name'], $newFilePath)) и сразу выполнит саму функцию move_uploaded_file и использует ее же в проверке условия?Мне казалось,что нужно ее сначала выполнить,после чего она вернет true или false и только потом использовать ее в проверке условия?
Да, отработает именно так, как вы и написали. Сначала выполнится и вернёт результат, который сразу будет проверен в условии. Можно и в переменную положить, $isUploaded, например, а затем проверять её.
Еще один замечательный урок пройден :)
Неплохо) Из улучшений - можно в текстах ошибок подставлять значения переменных с максимальным размером, высотой и шириной. Переделывать не надо - просто для размышления.
1.
3.
4.
...
8 Мбайт это не 8000000 байт. Это 8 * 1024 * 1024.
Cпасибо. Это я грубо округлил 8,388,608 байт
тут закралась ошибка, если один из параметров будет нормальным, то второй не проверится.
Надо наверно
Верно
Хорошо! Только отступы нужно исправить, а то всё на одном уровне.
тут выдает варнинг при отсутствии файла для загрузки по переменной $fileSizeWidthHeight = getimagesize($filePatch);
Только у меня вопрос по getimagesize, В официальной документации предупреждают что бы не использовать ее для проверки изображения, а использовать Fileinfo.Отсюда вопрос может я неправильно написал и есть смысл использовать проверку getimagesize после того как проверим расширение файла?
отлично!!! только дважды "http://" повторяется
Поправил
Позвольте загружать только файлы размером меньше 8Мб. Сделайте это с помощью сравнения с $_FILES['attachment']['size'].
Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].
Разрешите загружать картинки с шириной не более 1280px и высотой не более 720px.
Весь код
Отлично!
почему в данном случае используется именно альтернативный синтаксис управляющих структур, ведь стандартная форма не намного длиннее?
На мой взгляд так в шаблонах смотрится лучше, но это вкусовщина, я не настаиваю чтобы вы писали так же.
также зациклился по данному вопросу, но мне сказали что можно писать и обычно и вообще это мало когда понадобиться, а может и вовсе )
У меня не работает данный скрипт из примера, пишет -
Объект не найден!
Запрашиваемый ресурс не найден. Ссылка на странице неверна или устарела. Пожалуйста, сообщите автору этой страницы об ошибке.
Если Вы считаете, что это ошибка сервера, пожалуйста, сообщите об этом веб-мастеру.
И вообще некоторые скрипты из заданий. Может быть это из-за того что я использую XAMP а не OpenServer??
Вы очень мало предоставили информации по Вашей проблеме, однозначно могу сказать, что проблема не в XAMP. Рекомендую воспользоваться инструментом разработчика Хрома, чтобы определить какой именно объект не найден, а так же внимательно проверить правильно ли указано местоположение каталога uploads из задания.
В самом начале курса я предупредил, что работаем в OpenServer. Выбираете что-то другое - разбирайтесь сами.
Отлично!
я извиняюсь, но ведь переменная $srcFileName хранит имя файла, а $newFilePath - путь, но работает и с той и с той переменной функция правильно или я что-то не понял >_<.
Приведи конкретный пример с путями. Не понял пока вопроса.
Во всех примерах используется данная переменная, хранящая имя файла.
в проверке расширения файла Вы используете её же, передавая функции pathinfo();
Хотя первым аргументом должен передаваться путь к файлу.
Имя файла - это тоже путь к файлу, просто он относительный (не полный). Получить от такого пути расширение - не проблема.
Спасибо за объяснение, теперь все понятно)
как-то так.
Отличная обработка ошибок в switch-case!
Позвольте загружать только файлы размером меньше 8Мб. Сделайте это с помощью сравнения с $_FILES['attachment']['size'].
Изучите директиву upload_max_filesize в файле php.ini. Установите её значение, равное 2M. Перезапустите веб-сервер. Попробуйте теперь загрузить файл, размером в 5Мб. Теперь обработайте соответствующую ошибку с помощью проверки значения $_FILES['attachment']['error'].
Разрешите загружать картинки с шириной не более 1280px и высотой не более 720px.
Хорошо. Вместо 1048576 лучше явно написать 1024*1024
понял, спасибо, остался вопрос, на который я пока не нашел ответа
почему мы в if ставим "!", у нас же функция проверяет на совпадение и если оно есть, то выдает TRUE, а в блок if переходит при TRUE
А я не знаю, почему у Вас так написано, выглядит как ошибка. Вы проверяли код на работу перед отправкой?
да, проверял, работает только когда стоит !
Подебажьте, посмотрите что не так.
Добрый день. Подскажите как реализовать такой случай.
Варианта 2:
ОК!
У меня почему-то коды ошибок возвращаются в цифровом формате, а не в текстовом. Можете подсказать, почему так происходит?
Они и должны быть числами)
8Мб это 810241024.
Но алгоритм верный?
Алгоритм в порядке, но из-за некорректного значения код работает неправильно.
Становится все интересней!
Отлично
Добавил функцию преобразования имени файла в более корректное и сделал вывод уже загруженных фото в каталоге.
Не надо функции внутри условий объявлять, можно выстрелить себе в ногу.
На самом деле не такой, а с таким же именем.
В остальном - отлично.
Спасибо, исправил.
Отлично
Супер! Второй вариант ошибок выглядит лучше.
1.
2.
3.
Отлично =)
Все хорошо, но вот такие числа - 8388608, лучше записывать в виде произведения исходных чисел (1024*1024*8), или выносить в константы с комментарием, что это за значение такое:
Ок
Странно, куда пропадают мои ответы? Пропали более 5 комментов к прошлым урокам и я вчера на этой странице оставлял решение домашки №1 - тоже пропало.
повторяю, домашка №1
Почему не 8мб? 5кб это 5*1024
Ну лень было картинку искать такого размера - по сути же правильно ?
Да
№2
Что ещё за блабла?
Вы оцениваете коммент или правильность кода?
Я оцениваю в целом, годится такое решение или нет. Непонятно, что именно за ошибка произошла.
Понимаю что задание №3 нужно делать через getimagesize но блин 3 часа убил чтобы вывести ее var_damp
получаю ошибки типа
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
Что не так - не нравятся слеши в пути к картинке?
Ну так там нет ещё этого файла. Вы же его ещё не скопировали.
getimagesize выдавал ошибку, когда нажимал "отправить", не выбрав файл. Или когда размер файла превышал заданный размер в php.ini (файл не приходил). Поэтому пришлось предварительно обернуть в условие:
Но теперь PHPStorm меня предупреждает о том, что переменные $imageWidth и $imageHeight могут быть не объявлены. Можно просто проигнорировать?)
А еще функция strtolower помогла учитывать файлы, у которых расширение было прописано верхним регистром :)
Отличное домашнее задание!
А вот шторм правильно говорит. В случае, когда временного файла нет, то нужно сразу об этом написать и выдать ошибку: не удалось загрузить файл. После чего сразу завершать скрипт.
Спасибо! Вроде все понятно, но предупреждение шторма все равно осталось, т.к. переменные используются в проверке ниже (после switch):
И вроде никаким образом скрипт не сработает в этом месте, если файл не пришел, но шторм все равно предупреждает :D
Вот этот блок:
Вот этот код должен быть не внутри какого-то условия. Он должен гарантированно выполниться перед if-ом, про который вы говорили.
Разобрался, спасибо!
Ок. Но elseif слитно пиши)
1.
2.
3.
Отлично!
...
8388608 - вот такое лучше записывать как 1024 1024 8 + выносить в константы.
$fileSize - лучше назвать imageSize, чтобы было понятнее, что там не мегабайты.
В остальном - отлично
Переменную лучше назвать imageSize.
Для двух разных случаев отдается одинаковый текст ошибки. Сложно будет понять, что именно не так. Лучше дополнять ошибки контекстом происходящего.
В остальном отлично.
Всё отлично, кроме
Откуда это значение?
Отлично
Отлично
Отлично
Отлично
Cтранно,я 10 раз проверил пути по которым записываю файл,но у меня он не хочет сохраняться в директории (пользуюсь убунту)
Исправил проблему изменением прав доступа у директории,в которую загружаются файлы.
Молодец)
В последнем,завершённом коде,каким образом мы файл из временной директории переносим в окончательную? Из урока я понял,что нужно вызывать move_uploaded_file,но я не вижу,чтобы мы его где-то вызывали.
А ты получше посмотри) он там есть
Он там есть только в виде проверки условия !move_uploaded_file($file['tmp_name']
Почитал комменты выше,понял как работает) С первого раза и не поймёшь.
Исправил.
лучше представлять такие числа в виде исходных чисел (8 * 1024 * 1024), и выносить в константы. Или хотя бы комменировать. Потому что сходу непонятно, что это такое.
Супер!
8388608 - такое лучше записывать в виде 8 1024 1024
Отлично. Только переменной $image стоит дать более осмысленное название.
За собачек в 2020 бьют по рукам)
И на сегодняшний момент вот такой синтаксис актуален:
8388608 - вот такое в коде лучше записывать в виде 8 1024 1024 и выносить в отдельные константы.
За DIRECTORY_SEPARATOR плюсик в карму от меня :)
Значит сначала нужно обработать эту ошибку, а потом уже пытаться узнать размер действительно существующего файла.
Отлично
Первое задание:
Второе задание:
Третье задание:
Но не могу понять с 3-им заданием. При загрузке изображения с шириной и высотой больше указанных, пишется сообщение об ошибке, но всё равно файл загружается в папку. Такого же не должно быть?
Смотря о какой папке речь. О временной, или о папке, в которую мы в итоге картинки сохраняем?
В папку uploads, в которую мы в итоге картинки сохраняем.
Ну конечно это неправильно) Разбирайтесь с отладчиком, что не так
Разобрался всё-таки))
Было:
Стало:
Теперь не загружает того, чего не надо))
Отлично
Отлично!
Я прописал подавление ошибки у функции getimagesize(), потому что меня ругали что имя файла не может быть пустым (filename cannot be empty), я уже пытался самостоятельно создавать временный файл и нечего не получилось :(
Есть ли какие-нибудь способы устранение данной ошибки?
По коду всё ок, с ошибкой такой ранее не сталкивался, погуглите
Добавил
Не увидел особой необходимости в этой проверке, если мы контролируем размер файла, как в первом задании.
Единственный вариант применения, который пришел в голову, - если мы пока что не знаем, что задано в php.ini. Поэтому:
В целом обработчик ошибок у меня выглядит так:
Отлично!
Отлично
Всё ок, кроме форматирования. Ну и вот тут дичь какая-то: http://localhost:63342/upload/uploads/
Вы что, до сих пор не настроили веб-сервер? С дебаггером тоже не работали до сих пор?
PSR? Вижу только в нескольких местах между if и открывающей скобкой нет пробела.
У меня на каждый урок отдельный домен. Открываю странички из шторма, поэтому через внутренний сервер. Чтобы не настраивать каждый раз деплоймент в шторме, использую стандартные настройки. Хотя согласен, нужно привыкать делать правильно. Уже переделал)
О каких настройках веб-сервера речь?
Дебаггер без проблем работает, только какое он имеет отношение к этому?
Еще и ошибку нашел)):
Нужно сделать как-то так:
а далее уже провеверять, если не нулл
А должны быть! И свитч ещё уехал.
А не проще файлики просто разные в одном проекте создавать.
О PHP в связке с Apache, а не штормовском "веб-сервере".
А откуда там нулл возьмётся?
Все что делали в рамках уроках - настроено и даже больше.
Я же его туда и установливаю, если там нет значения:
Я имел в виду, для чего вы это делаете? С чего взяли, что там может быть empty?
Когда например нажимаем кнопку отправить, но файл не был выбран. Или по другому можно делать инициализацию этих переменных не в начале скрипта, а уже в конкретных условиях, где проверяется расширение и разрешение соответственно.
Если файл не был выбран самая первая проверка не выполнится
У меня получилось как-то так:
Лучше представить как количество мегабайт, умноженное на количество килобайт в мегабайте, умноженное на количество байт в килобайте.
В остальном ОК.
так:
или лучше так:
Первый вариант)
После часа мучений вроде получилось)
8192000 лучше записать как 8*1024*1024
Некорректное использование тернарного оператора. Он используется для возврата одного из значений в правой части в левую часть выражения. У вас же он применяется для побочного вызова кода в случае выполнения или невыполнения условия. Используйте в таких случаях if-else.
Лучше использовать обычные слеши вместо обратных, не будет проблем при переходе на Linux.
8388608 лучше записать как 8 * 1024 * 1024
В остальном ОК.
8388608 лучше записать как 8 * 1024 * 1024
В остальном отлично
ставлю в дз ограничение 8 Мб, файлы не загружаются, но не из-за моего ограничения, а хз почему. в консоли выводится warning о том что файл превышает 8 Мб, но при этом в php.ini ограничение установлено на 2 Мб. Где может быть вообще еще это ограничение и как в php.ini его поменять, если линукс не дает сохранить изменения, файл доступен только для чтения?
В какой консоли?
ой, то есть в терминале выводится: PHP Warning: POST Content-Length of 10885169 bytes exceeds the limit of 8388608 bytes in Unknown on line 0
Как вы оказались в терминале, если речь шла о запуске скрипта через веб?
я в терминале запускаю команду
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 Мб. Извиняюсь, что побеспокоила.
Почему не пользуешься нормальным веб-сервером? Отладчик тоже не настраивала?
Супер
Почему имя файла написанный кириллицей сохраняется с кракозябрами?)
Видимо с кодировкой проблемы
Отлично!
Это не 8 Мб
Это ещё что за зверь? Дебаггером есть возможность пользоваться?
Это ещё что за зверь? Дебаггером есть возможность пользоваться?
это у меня через MAMP сайты с локального сервера по такому урлу открываются. xDebug работает (но чтобы он заработал нужно было совершить танец с бубном)))
У меня все время выдает ошибки. Ошибка при загрузке файла. Невозможно переместить файл. Файл не найден.
Какой у вас сервер? Дебажить пробовали?
1
2
3
А вот задача конечно ступорит.
8388608 лучше записать как 8 * 1024 * 1024
Задача на ваше усмотрение остаётся
Действительно хочу сделать домашку, но не могу понять условие.
Если разъясните, буду признаетелен...
Число комбинаций (k) может быть от нуля до числа, равному количеству элементов
У меня почему-то ошибки в браузере не выводятся, хотя в .ini я поставил display_errors = On и error_reporting = E_ALL. Также пробовал в самом коде прописывать error_reporting(E_ALL); и ini_set("display_errors", 1);. Да и если убрать в коде вот эту часть
то файлы выше 8 МБ грузятся без проблем и значение error в массиве равно 0, хотя в .ini файле у меня upload_max_filesize = 2M. Не могу понять в чем дело
Задачу пока не решил
Привет! А сервер перезапускал после изменения php.ini? Файл точно сохранил?
О каких конкретно ошибках речь?
Да, файл я сохранил и перезапустил, потом опять открывал и проверил, изменения сохранились
Ну, я просто подумал, что вот здесь
при превышении разрешенного размера должна выводиться какая-то ошибка. Если это не так, то прошу прощения, немного глупый. Но у меня также не выводилась ошибка из урока про подключение файлов (когда подключаемый файл не находится директивами require и include). Хотя тогда я был еще на PHP 7.0, может в этом дело. Но сейчас я точно менял ini файл 7.4
Ну это не ошибка программы, а просто текст ошибки, который мы сформировали.
Да, у каждой версии PHP свой php.ini, при переключении нужно вносить изменения заново.
С выводом ошибок я наконец-то смог совладать.
Да, про текст я понял, просто думал, что если не прописывать код, обрабатывающий ошибку, то вылезет какая-нибудь ошибка по типу тех же из урока про подключение файлов. Но я все еще не понимаю, почему файл грузится, хотя превышает размер, написанный в php.ini. И судя по всему, из-за этого же значение error в массиве $_FILES у меня всегда 0. Или так и должно быть? Извиняюсь, конечно, что так прикопался, просто в документации простенькое описание, что эта директива отвечает за максимальный размер закачиваемого файла, а нагуглить внятно ничего не смог.
В выводе phpinfo() какое значение у этой директивы?
50M
Ну, значит не там поменяли) Посмотрите, может там еще одна такая же строка, но с другим значением?
Но проблема в том, что я не только в ini файле пытался менять, но и в самом коде прописывать как ini_set('upload_max_filesize', '2M'), но значение error так же равно 0 при загрузке файла весом 11 МБ. Нашел примерно такой же вопрос на stackoverflow, но там как раз советуют написать в коде ini_set(). Пока больших проблем это не приносит, так что оставлю как есть, наверное.
Закрывающий тег ?> в конце файла не нужен.
В остальном - ОК
Мучался несколько дней, но задачу с нахождением комбинаций так и не осилил.
Ну пропустите пока
1.Подскажите, где на сервере правильно размещать папки с картинками и JS скриптами? На одном уровне с пабликом?
2.Папка public_html является какой то особенной для сервера, что ее видно наружу?
3.Что еще кроме точки входа можно показывать наружу?
Я все это уже прогуглил, но ответов на вопросы не убавилось, а наоборот.
Например:
При размещении js скриптов в папке на одном уровне с пабликом, уже даже сама IDE ругается на то, что не может найти эти файлы. После перемещения этой папки со скриптами внутрь папки public_html все начинает работать. Вот это и непонятно.
Файл htaccess лежит в паблике. Но зачем пользователям иметь доступ к этому файлу?
И в целом - что значит доступ пользователей? Т.е. любой пользователь может иметь доступ к индексному файлу? Или речь о доступе только на исполнение файла? Кто определяет уровень этого доступа? Это определяется настройками хостера?
Нужно в IDE значит указать корневую директорию веб-сервера. А вообще на эти ее "ругательства" можно забить.
Пользователям не нужно иметь доступ к .htaccess, это конфигурация apache для конкретной директории.
Так если бы вопрос был ТОЛЬКО в IDE, то можно было и забить. В самом браузере(разные пробовал) то тоже не работает, когда картинки/скрипты не внутри паблика.
Я не знаю, может это какие-то настройки сервера влияют на это..
В курсах по ООП .htaccess лежит же рядом с index.php
Ну и с вот этим тогда не понятно:
Те же картинки(например аватарки) - это же статические файлы и к ним нужен доступ пользователей? Если должны быть общедоступны, то должны быть внутри паблик папки, а не на одном уровне?
Они должны быть исключительно внутри паблика. Создайте рядом с index.php отдельную папку uploads или img и складывайте туда то, к чему должен быть доступ из браузера)
Добрый день! Все пункты задания получились. Попробовал ещё дополнительную проверку 'Размер загружаемого файла указанный в HTML-форме(UPLOAD_ERR_FORM_SIZE). Это не получилось. Подскажите, пожалуйста, что не так, и нужна ли эта проверка.
Такая проверка не имеет смысла. Проверка на сервере должна быть обязательно, по желанию - на стороне клиента.
Не могу разобраться, загружаю файл больше 8Мб, указал проверку, но этот файл даже не проверяется алгоритмом, просто перезагружается страница, будто я ничего не загружал.
Смотрел через дебаггер, попадает на строчку
и после неё сразу на html часть, как-будто ничего не передается в $_FILES.
Как это победить?
Может ли это быть из-за post_max_size с параметром в 8Мб?
Да, может
Возник вопрос почему getimagesize не работает с $file['name']
С другими заданиями разобрался.
Проблема с форматированием. Делайте отступы и переносы как в уроках. Для этого в шторме можно нажать Ctrl+Alt+L
Всегда используйте фигурные скобки для блоков if-else.
Рекомендую ознакомиться с другими решениями в комментариях.
Супер!
получилось так, после всех манипуляций:
8000000 - что за магическое число?)
Чёт я в самом начале материала застрял - Ошибка при загрузке файла.
Фот мой upload.php
Вот вывод в браузере
Ну написано что на 7 строке в массиве $file нет ключа logo.gif. Собственно, почему он там должен быть? Для чего так написали?)
А, ну понял, что 'name' надо так и оставить - ключ, а не задавать значение.
Теперь вроде заработало.
Ну вы отладчиком посмотрите что в этом массиве есть, чтобы не наугад писать)
Здравствуйте! Проверьте пожалуйста, все ли верно?
Да, отлично. Единственное, ограничение на размер я бы записал как 810241024, так нагляднее
Понял. Спасибо! Учту на будущее.
Лучше сделать в одном регистре, и при сравнении с расширением файла приводить к тому же регистру.
8388608 лучше записать как 102410248
Дополнил код к существующему
Отлично
"Позвольте загружать только файлы размером меньше 8Мб".
Как то так.
Супер!
Если я форме через скрытый инпут провалидировал размер файла, считается ли это корректной проверкой?
Нет. Этот скрытый инпут можно в браузере вертеть как душе угодно