БлогNot. PHP: самая простая загрузка файлов

PHP: самая простая загрузка файлов

В связи со сверхбольшой занятостью, вряд ли чего-то дельного напишу на этой и следующей неделе :(

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

Здесь я ставил цель показать загрузку файла "базовым" и совсем простым кодом, по сути, контролируется только размер файла, уж без этого как-то совсем нехорошо :)

Файл index.html представляет собой обычную форму HTML (без оформления начала и конца файла), в форме соблюдены все 3 условия успешной загрузки:

  • отправка данных методом POST (атрибут method="post" в теге формы);
  • атрибут enctype="multipart/form-data" в теге формы;
  • элемент HTML <input type="file"> в теге формы.

Данные принимает скрипт upload.php, находящийся в той же папке, что и файл HTML, а загруженные файлы он "складывает" во вложенную папку upload внутри папки скрипта (на реальном хостинге нужно будет позаботиться о правильных правах на неё, в Denwer сработает и так). В файле также отсутствует обрамление тегами HTML по стандарту. Вот как выглядит оглавление папки со скриптом:

структура папок скрипта в Denwer
структура папок скрипта в 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


теги: учебное php

11.01.2017, 15:06; рейтинг: 2800