PHP: самая простая загрузка файлов
В связи со сверхбольшой занятостью, вряд ли чего-то дельного напишу на этой и следующей неделе :(
Ну а эта маленькая заметка просто возникла в процессе работы. На моём сайте уже есть развёрнутый пример на загрузку файлов со стороны пользователя, включающий замечания по поводу того, что это лучше делать отдельным классом и следить за правами на папки.
Здесь я ставил цель показать загрузку файла "базовым" и совсем простым кодом, по сути, контролируется только размер файла, уж без этого как-то совсем нехорошо :)
Файл index.html
представляет собой обычную форму HTML (без оформления начала и конца файла), в форме соблюдены все 3 условия успешной загрузки:
- отправка данных методом POST (атрибут
method="post"
в теге формы); - атрибут
enctype="multipart/form-data"
в теге формы; - элемент HTML
<input type="file">
в теге формы.
Данные принимает скрипт upload.php
, находящийся в той же папке, что и файл HTML, а загруженные файлы он "складывает" во вложенную папку upload внутри папки скрипта (на реальном хостинге нужно будет позаботиться о правильных правах на неё, в Denwer
сработает и так). В файле также отсутствует обрамление тегами HTML по стандарту. Вот как выглядит оглавление папки со скриптом:
структура папок скрипта в Denwer
По картинке видно, что при запущенном локалхосте Denwer обратиться к скрипту из браузера можно по URL-адресу
http://localhost/upload/
Файл index.html
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"> <input type="submit" value="Загрузить"> </form>
Файл upload.php
<?php if ($_FILES['filename']['size'] > 3*1024*1024) { echo 'Файл больше 3 Мб!'; exit; } if (is_uploaded_file($_FILES['filename']['tmp_name'])) { $newname = './upload/'.$_FILES['filename']['name']; move_uploaded_file($_FILES['filename']['tmp_name'], $newname); echo 'Файл загружен: '. '<a href="'.$newname.'" target="_blank">ссылка</a>'; } else { echo 'Ошибка загрузки файла!'; exit; } echo '<br><a href="index.html">Назад</a>'; ?>
В принципе, код сработает и в PHP7 (проверял на XAMPP), но файлы лучше перекодировать в кодировку Юникода UTF-8 и дополнить обрамлением HTML, например, так:
Файл index.html
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Загрузка</title> </head><body> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"> <input type="submit" value="Загрузить"> </form> <?php $array = scandir('./upload/'); foreach ($array as $file) { if (mb_substr($file,0,1,'utf-8')!='.') echo '<a href="./upload/'.$file.'">'.$file.'</a> '; } ?> </body></html>
Файл upload.php
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Загрузка</title> </head><body> <?php $link = '<br><a href="index.php">Назад</a>'; if (!isset($_FILES['filename']['tmp_name'])) { die ('Не передан файл или недопустимый размер!'.$link); } if (is_uploaded_file($_FILES['filename']['tmp_name'])) { $newname = './upload/'.basename($_FILES['filename']['name']); move_uploaded_file($_FILES['filename']['tmp_name'], $newname); echo 'Файл загружен: '. '<a href="'.$newname.'" target="_blank">ссылка</a>'; } else { echo 'Ошибка загрузки файла!'; } echo $link; ?> </body></html>
В php7 подавить сообщение вида "Warning: POST Content-Length of ***** bytes exceeds the limit of ***** bytes in Unknown on line 0", срабатывающее раньше проверок, выполняемых из кода, я смог только одним способом - поставив в файле .htaccess
директиву
php_flag display_startup_errors off
11.01.2017, 15:06 [4690 просмотров]