Как скачать файл на php4 мин для чтения
Содержание:
- Загрузка файлов на сервер на php. Введение
- Пример 1: Загрузить файл с именем файла
- Сокеты, multipart/form-data
- Чтение файла и работа с текстом
- Полный загрузить файл PHP скрипт
- PHP Полная загрузка файла скрипта
- Создание HTML-формы
- Когда move uploaded file PHP не работает
- Создание сценария загрузки
- Настройка параметров PHP
- Как это все работает вместе
- Форма для сбора данных
- Отправка изображения
- Сделать файл php при нажатии на кнопку с содержимым
- Переходим на сервере и работаем с PHP
- PHP Создание файла для загрузки скрипта
- Создание скрипта загрузки файла PHP
- Пример 2: Загрузить файл с указанием пути к файлу
- Возможности UC Browser
- Манипуляции с изображениями с помощью ImageMagick
- Чтение информации о загруженном файле
- Вопросы безопасности
- PHP Создание HTML формы
- Создание формы загрузки
- Подводим итоги и делаем выводы
Загрузка файлов на сервер на php. Введение
В этой статье я хочу показать как можно быстро и просто реализовать загрузку файлов на сервер с помощью php с проверками файла на размер и на формат. Эта тема хоть и простая и очень распространенная, все же по ней тоже часто возникают вопросы у программистов новичков.
Чтобы передать какие-либо данные из браузера на сервер необходимо на странице создать html-форму:
<form action="/form/index.php" method="POST" enctype="multipart/form-data"> <input type="file" name="upload_file"><br> <input type="submit" value="Загрузить"><br> </form>
В которой будет указан путь к скрипту на сервере, куда будут отправлены данные, в данном случае это /form/index.php. Также указывается метод передачи данных — POST или GET. И необходимо указать тип передаваемых данных, чтобы передавать файлы, тип должен быть multipart/form-data.
Когда сама форма готова, внутри нее следует создать input и типом file, в него пользователь сможет загрузить файл, для последующей отправки на сервер.
Далее начинается самое интересное — получение и обработка данных на сервере. Все данные о файле будет храниться в суперглобальной переменной $_FILE. Поэтому первым делом на сервере необходимо проверить — существует эта переменная или нет. В случае существования, мы можем проверить размер файла, получить его имя, расширение и путь к нему, файл будет хранится во временных файлах.
Пример 1: Загрузить файл с именем файла
В этом примере мы создадим HTML-файл со следующим кодом, в котором имя файла будет передано в качестве параметра URL-адреса с именем path, а значение этого параметра будет передано в файл PHP с именем download.php.
download2.html
<html> <head> <title>Скачивать файлы</title> </head> <body> <p><a href="download.php?path=abc.txt">Скачать файл TEXT</a></p> <p><a href="download.php?path=horizon.zip">Скачать файл ZIP</a></p> <p><a href="download.php?path=lecture.pdf">Скачать файл PDF</a></p> <p><a href="download.php?path=rose.jpg">Скачать файл JPG</a></p> </body> </html>
Мы создадим файл PHP со следующим кодом для принудительной загрузки файла. Здесь функция isset() используется для проверки, определен ли $_GET . Если переменная определена, функция file_exists() используется для проверки, существует ли файл на сервере. Затем функция header() используется для установки необходимой информации заголовка перед использованием функции readfile(). Функция basename() используется для получения имени файла, а функция sizes() используется для чтения размера файла в байтах, который будет показан в открывшемся диалоговом окне для загрузки файла. функция flush()используется для очистки буфера вывода. Здесь функция readfile() используется только с именем файла.
download.php
<?php if(isset($_GET)) { //Читать файл $filename = $_GET; //Проверка на существование файла if(file_exists($filename)) { //Определение информации заголовка header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header("Cache-Control: no-cache, must-revalidate"); header("Expires: 0"); header('Content-Disposition: attachment; filename="'.basename($filename).'"'); header('Content-Length: '. filesize($filename)); header('Pragma: public'); //Очистить выходной буфер системы flush(); //Считайте размер файла readfile($filename); //Завершить работу со скриптом die(); } else{ echo "Файл не существует."; } } else echo "Имя файла не определено." ?>
Выходные данные
Сокеты, multipart/form-data
// устанавливаем соединение с сервером $fp = fsockopen('server.com', 80, $errno, $errstr, 30); if (!$fp) die($errstr.' ('.$errno.')'); $name = 'Евгений'; $message = 'Какое-то сообщение от пользователя'; $file = 'image.jpg'; // содержимое файла $content = file_get_contents($file); // разделитель $boundary = md5(uniqid(time())); $body = '--'.$boundary."\r\n"; $body = $body.'Content-Disposition: form-data; name="name"'."\r\n\r\n"; $body = $body.$name."\r\n"; $body = $body.'--'.$boundary."\r\n"; $body = $body.'Content-Disposition: form-data; name="message"'."\r\n\r\n"; $body = $body.$message."\r\n"; $body = $body.'--'.$boundary."\r\n"; $body = $body.'Content-Disposition: form-data; name="upload"; filename="image.jpg"'."\r\n"; $body = $body.'Content-Type: image/jpeg'."\r\n"; $body = $body.'Content-Transfer-Encoding: binary'."\r\n\r\n"; $body = $body.$content."\r\n"; $body = $body.'--'.$boundary.'--'; // пишем в сокет метод, URI и протокол fwrite($fp, 'POST /get.php HTTP/1.1'."\r\n"); // а также имя хоста fwrite($fp, 'Host: server.com'."\r\n"); // отправляем заголовки fwrite($fp, 'Content-Type: multipart/form-data; boundary='.$boundary."\r\n"); fwrite($fp, 'Content-Length: '.strlen($body)."\r\n\r\n"); // теперь передаем данные fwrite($fp, $body); // получаем ответ $result = ''; while ( !feof($fp) ) $result .= fgets($fp, 1024); // закрываем соединение fclose($fp); // выводим ответ в браузер echo $result;
Файл get.php на сервере http://server.com:
print_r( $_POST ); print_r( $_FILES ); move_uploaded_file($_FILES'upload''tmp_name', 'image.jpg')
Результат:
HTTP/1.1 200 OK Server: Apache/2.0 (Win32) PHP/5.1 X-Powered-By: PHP/5.1 Content-Length: 310 Array ( => Евгений => Какое-то сообщение от пользователя ) Array ( => Array ( => image.jpg => image/jpeg => C:\Windows\Temp\phpA457.tmp => 0 => 416919 ) )
Чтение файла и работа с текстом
Конечно, текст можно загрузить, пользуясь текстовым полем или textarea, но для больших файлов этот метод не очень удобен (браузер может тормозить), я уж не говорю о неудобствах при использовании мобильных устройств.
Теперь нужно загрузить этот текст в какую то переменную для дальнейшей обработки. Тут обычно используют функцию file_get_contents
Как видите, функция может принимать множество параметров, самый простой случай это такое использование:
$mytext = file_get_contents($_FILES);
1 | $mytext= file_get_contents($_FILES’myfile»tmp_name’); |
Текст загружен, дальше с ним можно уже что то делать. А потом, к примеру, результаты записать в другой файл.
Полный загрузить файл PHP скрипт
Полный файл «upload.php» теперь выглядит следующим:
<?php$target_dir = «uploads/»;$target_file = $target_dir . basename($_FILES);$uploadOk = 1;$imageFileType =
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));// Check if image file is a actual image or fake imageif(isset($_POST)) { $check = getimagesize($_FILES); if($check !== false) { echo «File is an image — » . $check . «.»; $uploadOk = 1; } else { echo «File is not an image.»; $uploadOk = 0; }}// Check if file already existsif (file_exists($target_file)) { echo «Sorry, file already exists.»; $uploadOk = 0;}
// Check file sizeif ($_FILES > 500000) { echo «Sorry, your file is too large.»; $uploadOk = 0;
}// Allow certain file formatsif($imageFileType != «jpg» && $imageFileType != «png» && $imageFileType != «jpeg»&& $imageFileType != «gif» ) { echo «Sorry, only JPG, JPEG, PNG & GIF files are allowed.»; $uploadOk = 0;}// Check if $uploadOk is set to 0 by an errorif ($uploadOk == 0) { echo «Sorry, your file was not uploaded.»;// if everything is ok, try to upload file} else { if (move_uploaded_file($_FILES, $target_file)) { echo «The file «. basename( $_FILES). » has been uploaded.»; } else { echo «Sorry, there was an error uploading your file.»; }}?>
PHP Полная загрузка файла скрипта
Полный файл «upload.php» выглядит так:
<?php$target_dir = «uploads/»;$target_file = $target_dir . basename($_FILES);$uploadOk = 1;$imageFileType =
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));// Проверьте, является ли файл изображения фактическим изображением или поддельным изображениемif(isset($_POST)) { $check = getimagesize($_FILES); if($check !== false) { echo «Файл является изображением — » . $check . «.»; $uploadOk = 1; } else { echo «Файл не является изображением.»; $uploadOk = 0; }}// Проверить, существует ли файлif (file_exists($target_file)) { echo «Извините, файл уже существует.»; $uploadOk = 0;}
// Проверить размер файлаif ($_FILES > 500000) { echo «Извините, ваш файл слишком большой.»; $uploadOk = 0;
}// Разрешить определенные форматы файловif($imageFileType != «jpg» && $imageFileType != «png» && $imageFileType != «jpeg»&& $imageFileType != «gif» ) { echo «Извините, разрешено только файлы JPG, JPEG, PNG и GIF.»; $uploadOk = 0;}// Проверьте, имеет ли $uploadOk значение 0 по ошибкеif ($uploadOk == 0) { echo «Извините, ваш файл не был загружен.»;// если все в порядке, попробуйте загрузить файл} else { if (move_uploaded_file($_FILES, $target_file)) { echo «Файл «. basename( $_FILES). » был загружен.»; } else { echo «К сожалению, произошла ошибка при загрузке файла.»; }}?>
Создание HTML-формы
Затем создайте HTML-форму, которая позволит пользователям выбрать файл изображения, который они хотят загрузить:
<!DOCTYPE html><html><body><form action=»upload.php» method=»post»
enctype=»multipart/form-data»> Select image to upload: <input type=»file» name=»fileToUpload» id=»fileToUpload»> <input type=»submit» value=»Upload Image» name=»submit»>
</form></body></html>
Некоторые правила, чтобы следовать для HTML-формы выше:
- Убедитесь, что в форме используется метод = «Post»
- Форма также нуждается в следующем атрибуте: Enctype = «многокомпонентные/формы-данные». Он определяет, какой тип контента использовать при отправке формы
Без требований выше, Загрузка файла не будет работать.
Другие вещи, котор нужно заметить:
Атрибут type = «file» тега показывает поле ввода в виде элемента управления «Выбор файла» с кнопкой «Обзор» рядом с элементом управления вводом
Приведенная выше форма отправляет данные в файл под названием «upload.php», который мы создадим далее.
Когда move uploaded file PHP не работает
Вам кажется, что вы все сделали правильно, а интерпретатор выдает ошибку? Файл отказывается загружаться в назначенную директорию и появляется в абсолютно неожиданных местах? В первую очередь проверьте php.ini на разрешенный размер в параметре upload_max_filesize. Чаще всего такая ошибка возникает у Denver. Поэтому откройте php.ini (обычно он находиться в папке php) и просто установите нужный вам размер:
Если вы работаете на сервере, поинтересуйтесь у провайдера, файлы какого размера разрешено загружать. На бесплатном хостинге максимальный объем обычно 2 Мбайта. Вторая причина, по которой код может давать сбой, — неверно назначенная директория. Проверьте второй аргумент функции move_uploaded_file, он должен включать путь и обязательно имя.
Создание сценария загрузки
Существует одна глобальная переменная PHP, называемая $_FILES. Эта переменная является ассоциированным массивом двойных измерений и сохраняет всю информацию, связанную с загруженным файлом. Поэтому, если значение, присвоенное атрибуту имени входа в форме загрузки, было файлом , тогда PHP создаст следующие пять переменных —
- $_FILES — загруженный файл во временном каталоге на веб-сервере.
- $_FILES — фактическое имя загруженного файла.
- $_FILES — размер в байтах загруженного файла.
- $_FILES — тип MIME загруженного файла.
- $_FILES — код ошибки, связанный с загрузкой этого файла.
пример
Ниже приведен пример загрузки изображений и возврата результатов в виде информации о загруженном файле.
<?php if(isset($_FILES)){ $errors= array(); $file_name = $_FILES; $file_size = $_FILES; $file_tmp = $_FILES; $file_type = $_FILES; $file_ext=strtolower(end(explode('.',$_FILES))); $expensions= array("jpeg","jpg","png"); if(in_array($file_ext,$expensions)=== false){ $errors[]="extension not allowed, please choose a JPEG or PNG file."; } if($file_size --> 2097152) { $errors[]='File size must be excately 2 MB'; } if(empty($errors)==true) { move_uploaded_file($file_tmp,"images/".$file_name); echo "Success"; }else{ print_r($errors); } } ?> <form action="" method="POST" enctype="multipart/form-data"> <input type="file" name="image"> <input type="submit"> <ul> <li>Sent file: <?php echo $_FILES;?></li> <li>File size: <?php echo $_FILES;?></li> <li>File type: <?php echo $_FILES;?></li> </ul> </form>
Новые статьи
- Ошибки в PHP и обработка исключений — 12/04/2018 19:21
- Регулярные выражения PHP -Кванторы, мета-символы и модификаторы — 12/04/2018 19:20
- Сеансы PHP — Запуск, уничтожение, сессии без файлов cookie — 12/04/2018 19:20
- PHP-файлы cookie — Настройка, доступ и удаление cookie — 12/04/2018 19:19
- Файлы PHP и ввод-вывод — открытие, чтение, запись и закрытие файла — 12/04/2018 19:18
- Методы PHP GET и POST, переменная $_REQUEST — 12/04/2018 19:17
Предыдущие статьи
- Объектно-ориентированное программирование в PHP — 12/04/2018 19:15
- Включение файла в PHP — Функция include и require — 12/04/2018 19:14
- Предопределенные переменные PHP — Суперглобальные массивы и переменные сервера — 12/04/2018 19:13
- Функции с параметрами, динамические вызовы, создание функции в PHP — 12/04/2018 19:12
- Типы операторов PHP — категории, присваивания, логические операторы — 12/04/2018 19:11
- Типы циклов PHP for, foreach, continue, break, do-while — 12/04/2018 19:10
- Принятие решений PHP — ElseIf Switch — 12/04/2018 19:09
- Типы констант PHP — Различия между константами и переменными — 12/04/2018 19:08
- Массивы PHP: Многомерные, ассоциативные и числовые массивы — 12/04/2018 19:07
- Типы переменных, область и имена переменных в PHP — 12/04/2018 19:06
- Строки в PHP, strpos, strlen, конкатенация строк — 12/04/2018 19:05
- Дата и время, получение, преобразование времени в PHP — 12/04/2018 19:03
- Обзор синтаксиса, канонические теги, комментирование PHP-кода — 12/04/2018 19:02
- Введение в PHP. Общее использование, характеристики PHP — 12/04/2018 19:01
Настройка параметров PHP
Существует несколько настроек конфигурации PHP, которые вам следует предварительно проверить для успешной загрузки файлов. В этом разделе мы рассмотрим все параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.
Если вы не знаете, где найти файл php.ini, вы можете использовать , чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его из браузера.
Вот выдержка из установочного файла с некоторыми полезными значениями по умолчанию.
Ключевые настройки
Значение директивы должно быть установлено на , чтобы разрешить загрузку файлов. Значение по умолчанию для этой директивы — .
Директива позволяет вам настроить максимальный размер загруженного файла. По умолчанию он установлен в (два мегабайта), и вы можете переопределить этот параметр, используя файл .htaccess. Два мегабайта не очень соответствуют сегодняшним стандартам, поэтому вам, возможно, придется это увеличить. Если вы получите сообщение об ошибке — при попытке загрузить файл, вам необходимо увеличить это значение. Если вы это сделаете, обязательно увеличьте (см. ниже).
Устанавливает временный каталог, который будет использоваться для хранения загруженных файлов. В большинстве случаев вам не нужно беспокоиться об этой настройке. Если вы не установите его, будет использоваться системный временный каталог по умолчанию.
Директива позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью POST-запросов, это значение должно быть больше, чем указано в директиве . Например, если ваш составляет (16 мегабайт), вам может потребоваться установить в .
Это позволяет вам установить максимальное количество файлов, которые могут быть загружены за раз. По умолчанию , разумное количество.
Это максимальное количество секунд, которое скрипту разрешено анализировать входные данные. Вы должны установить его на разумное значение, если вы имеете дело с большими загрузками файлов. (60 секунд) является хорошим показателем для большинства приложений.
Директива указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам необходимо убедиться, что значение этой директивы больше, чем указано в директиве . Значение по умолчанию — (128 мегабайт), поэтому, если у вас нет очень больших и , вам не нужно беспокоиться об этом.
Это максимальное количество секунд, разрешенное для работы скрипта. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вы можете рассмотреть возможность увеличения этого значения. (30 секунд) должны хорошо работать для большинства приложений.
Теперь давайте построим реальный пример, чтобы продемонстрировать загрузку файлов в PHP.
Как это все работает вместе
Не забудьте создать каталог uploaded_files и сделать его доступным для записи пользователем web-server. Затем перейдите и запустите файл index.php, который должен отобразить форму загрузки файла, которая выглядит так:
Нажмите кнопку Browse, чтобы открыть диалоговое окно, которое позволяет вам выбрать файл с вашего компьютера. Выберите файл с одним из расширений, разрешенным в нашем скрипте, и нажмите кнопку Загрузить.
Это должно отправить форму, и если все будет хорошо, вы должны увидеть загруженный файл в каталоге uploaded_files. Вы также можете попробовать загрузить другие файлы с расширениями, которые не разрешены, и проверить, предотвращает ли наш скрипт такие загрузки.
Форма для сбора данных
PHP поддерживает загрузку любых файлов методом POST. Поэтому для передачи данных серверу, или сохранения их на локальную машину нужна HTML-форма. С помощью разметки выделите отдельное место, где бы пользователь мог выбрать файл. Сценарии нужно настроить все так, чтобы данные отправлялись без сбоев. Рассмотрим этот процесс на примере загрузки фотографии для профиля.
Обратите внимание на атрибут enctype=»multipart/form-data». Именно благодаря ему форма настроена на получение данных
Чтобы пользователи не придумали загружать котиков на 25 Мбайт, в поле hidden нужно обязательно установить ограничение на размер картинок. Для изображения профиля вполне достаточно 2 Мбайт, как в этом примере.
Отправка изображения
В форме выше в атрибуте action стоит <?php echo $_SERVER;?>, означающий, что прием и обработка изображения будет происходить в этом же документе. Если вас это смущает и вы хотите, чтобы для каждого действия был свой отдельный скрипт, вставьте на место конструкции имя сценария, например, create_profile.php. Теперь весь код, включая работу с функцией PHP move uploaded file , записывайте в этом файле.
В коде присутствуют вспомогательные переменные:
- В $upload_dir прописан путь к директории для загрузки. Вместо HOSW_WWW_ROOT пишите абсолютный путь к рабочему каталогу на сервере или у себя на компьютере.
- Переменная $image_fieldname — это имя поля для изображения в HTML-форме.
Как видите, перед вызовом move uploaded file находятся строки, выполняющие проверку загружаемого изображения. Конечно, безопасные PHP-приложения — это миф, но должна присутствовать хотя бы минимальная защита.
Массив проверки ошибок $php_errors начинается не с нуля, а с единицы. Под индексом стоит $_FILES, который в случае удачной загрузки возвращает число 0. В PHP $_FILES — это специальный массив, содержащий всю информацию о файле. Для доступа к этим данным используется индекс с именем поля ввода, которое мы ранее вывели в отдельную переменную $image_fieldname:
Сделать файл php при нажатии на кнопку с содержимым
Сделать файл php при нажатии на кнопку с содержимым
+ он же в
файл с контентом
У нас есть три формы input + textarea + submit
Из формы с помощью post отправляем два значения.
Получаем их в переменные:
$title = $_POST; $textarea = $_POST;
Загоняем каркас страницы с нашими переменным в другу переменную:
$HTML = ‘<!DOCTYPE html><head><html lang=»ru»><meta charset=»UTF-
8″><title>’.$title.'</title>
</head>
<body>
‘.$textarea.’
</body>
</html>’;
С помощью file_put_contents записываем данные в файл :
$write = @file_put_contents( $dir .’/’.$name_page , $HTML);
И последнее о чем не сказали — это переменная $name_page — которая будет названием файла. Для этого, русский текст заголовка превратим в латиницу с помощью транслитерации
115 секунде
Переходим на сервере и работаем с PHP
Информация о загрузке файла предоставляется с помощью многомерного массива . Этот массив обладает своей структурой, назначенными именами для полей файла в форме HTML, точно так же, как и при работе с и . Затем массив каждого файла содержит следующие элементы:
- — хранит исходное имя файла;
- — сохраняет mime-типа файла;
- — сохраняет размер файла (в байтах);
- — хранит имя временного файла;
- — хранит код ошибки, полученный в результате передачи.
При помощи функции мы можем перенести файл из своего временного каталога в постоянное место. Так же хорошей практикой является использовать именно её вместо и для этой цели, поскольку она выполняет дополнительные проверки, чтобы гарантировать, что файл был действительно загружен запросом HTTP методом POST.
Если вы собираетесь сохранить файл с исходным именем, предоставленным пользователем, рекомендуется убедиться, что это безопасно. Имя файла не должно содержать символов, которые могут повлиять на путь назначения, например, косая черта (слэш). Имя файла должно быть уникальным, чтоб избежать затирания существующих с тем же именем (если это не предусматривается вашим приложением). Гарантировать это можно заменяя любые символы символом подчеркивания, который не является буквой, а затем добавляя увеличивающийся номер, если файл с таким именем уже существует.
Вот так как выглядит получение и обработка загрузки файла при помощи PHP:
Сначала мы удостоверяемся, что PHP загрузка файла на сервер прошла без ошибок. Затем определяем безопасное имя файла, как я только что описал выше, а затем перемещаем файл в его конечный каталог с помощью . И наконец делаем вызов , чтобы убедиться, что в новом файле установлены необходимые права доступа.
PHP Создание файла для загрузки скрипта
Файл «upload.php» содержит код для загрузки файла:
<?php$target_dir = «uploads/»;$target_file = $target_dir . basename($_FILES);$uploadOk = 1;$imageFileType =
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));// Проверьте, является ли файл изображения фактическим изображением или поддельным изображениемif(isset($_POST)) { $check = getimagesize($_FILES); if($check !== false) { echo «Файл является изображением — » . $check . «.»; $uploadOk = 1; } else { echo «Файл не является изображением.»; $uploadOk = 0; }}?>
Объяснение скрипта PHP:
- — указывает каталог, в который будет помещен файл
- — указывает путь к загружаемому файлу
- — еще не используется (будет использоваться позже)
- — содержит расширение файла (в нижнем регистре)
- Затем проверяется, является ли файл изображения, фактическим изображением или поддельным изображением
Примечание: Вам нужно будет создать новый каталог с именем каталога
«uploads», где будет находиться загруженный файл «upload.php».
Создание скрипта загрузки файла PHP
Файл «upload. php» содержит код для загрузки файла:
<?php$target_dir = «uploads/»;$target_file = $target_dir . basename($_FILES);$uploadOk = 1;$imageFileType =
strtolower(pathinfo($target_file,PATHINFO_EXTENSION));// Check if image file is a actual image or fake imageif(isset($_POST)) { $check = getimagesize($_FILES); if($check !== false) { echo «File is an image — » . $check . «.»; $uploadOk = 1; } else { echo «File is not an image.»; $uploadOk = 0; }}?>
PHP скрипт объяснил:
- $target_dir = «uploads/» — Указывает каталог, в который будет помещен файл
- $target_file Указывает путь к загружаемому файлу
- $uploadOk=1 еще не используется (будет использоваться позже)
- $imageFileType содержит расширение файла (в нижнем регистре)
- Next, Проверьте, является ли файл изображения реальным изображением или фальшивым изображением
Примечание: Вам нужно будет создать новый каталог под названием «закачки» в каталоге, где находится файл «upload.php». Загруженные файлы будут сохранены там.
Пример 2: Загрузить файл с указанием пути к файлу
Если файл существует в указанном месте, путь к файлу необходимо указать в URL-адресе. В этом примере мы создадим HTML-файл со следующим кодом, который будет передавать имя файла с путем к файлу:
download3.html
<html> <head> <title>Скачать файлы</title> </head> <body> <p><a href="download.php?path=downloads/lecture.pdf">Скачать PDF file</a></p> <p><a href="download2.php?path=downloads/rose.jpg">Скачать JPG file</a></p> </body> </html>
Мы создадим файл PHP со следующим кодом, чтобы загрузить файл по пути к файлу. Код PHP в предыдущем примере будет немного изменен для загрузки файла по заданному пути. Функция clearstatecache() используется для очистки кеша, который был ранее сохранен. В функции readfile() используются два аргумента.
download2.php
<?php if(isset($_GET)) { //Читать url $url = $_GET;//Очистить кэш clearstatcache(); //Проверьте, существует ли путь к файлу или нет if(file_exists($url)) { //Определение информации заголовка header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($url).'"'); header('Content-Length: '. filesize($url)); header('Pragma: public'); //Очистить выходной буфер системы flush(); //Считайте размер файла readfile($url,true); //Завершить работу со скриптом die(); } else{ echo "Путь к файлу не существует."; } } echo "Путь к файлу не определен." ?>
Возможности UC Browser
- Комфортный контроль над закладками и панелью управления, умная система визуальных закладок;
- Быстрый поиск и загрузка сайтов, а также веб-приложений;
- Переключение движков Webkit и Trident;
- Наличие ночного режима – меньше устают глаза;
- Имеется интегрированный режим «инкогнито»;
- Встроенный блокировщик рекламы ad block;
- Возможность сжатия страниц — экономит 90% трафика с помощью прокси-серверов;
- Интегрированы специальные настройки оптимизации скорости;
- Переключение между различными темами оформления, персонализация;
- Можно добавить расширения из магазина дополнений Google Chrome;
- Настройка жестов мыши и горячих клавиш в десктопной версии бесплатного UC браузер;
- Произведение снимков экрана, снятие скриншотов.
Преимущества
Недостатки
Манипуляции с изображениями с помощью ImageMagick
Чтение информации о загруженном файле
Тогда на стороне сервера в коде PHP вы сможете получить набор данных, описывающий загруженный файл, например:
Array(
=> Array (
=> treasure-map-3.jpg
=> image/jpeg
=> D:\OpenServer.526\userdata\temp\phpA8EE.tmp
=> 0
=> 83604
)
)
1 |
Array( myfile=>Array( name=>treasure-map-3.jpg type=>imagejpeg tmp_name=>D\OpenServer.526\userdata\temp\phpA8EE.tmp error=> size=>83604 ) ) |
Этот набор данных хранится в массиве $_FILES, где каждый элемент представляет собой описание загруженного файла. Ключи массива соответствуют именам полей, которые вы задали в форме.
Если PHP удалось загрузить файл на сервер, то error равен 0, а tpm_name — содержит путь до временно созданного файла. Оригинальное название хранится в переменной name, также есть дополнительная информация о типе и размере файла.
Не стоит здесь доверять информации о типе файла, т.к. это просто расшифровка расширения.
Вопросы безопасности
Вы бы позволили совершенно незнакомым людям хранить файлы на наших персональных компьютерах? Не думаю так, и все же это именно то, что вы делаете, когда разрешаете загрузку файлов в вашем приложении. Вы можете намереваться загрузить изображение пользователя для страницы профиля, но что, если он попытается загрузить специально созданный, наполненный вирусами исполняемый файл? Я хотел бы поделиться несколькими шагами, которые вы можете предпринять, чтобы минимизировать риски безопасности, связанные с возможностью загрузки файлов.
Один из них заключается в том, чтобы проверить тип загружаемого файла, каким он должен быть. Опираться на значение или на расширение имени файла не является безопасным, поскольку оба могут легко подделываться. Скорее, используйте функцию , чтобы проверить содержимое файла и определить, действительно ли это GIF, JPEG или один из нескольких других поддерживаемых форматов изображений. Если недоступен (функция требует, чтобы расширение Exif было включено), вы можете использовать . Массив, возвращаемый ей, будет содержать тип изображения, если он распознан.
Для файлов без изображения вы можете использовать для вызова утилиты файлов unix. он определяет тип файла, ища известные двоичные подписи в ожидаемых местах.
Еще один шаг, который вы можете предпринять, — наложить жесткие ограничения на общий размер запроса POST и количество файлов, которые можно загрузить. Для этого укажите соответствующее значение для директив , и в php.ini. Директива upload_max_size указывает максимальный размер загрузки файла. В дополнение к размеру загрузки вы можете ограничить размер всего запроса POST директивой . — это новая директива (добавлена в версии 5.2.12), которая ограничивает количество загрузок файлов. Эти три директивы помогают защитить ваш сайт от атак, которые пытаются нарушить его доступность, вызывая интенсивный сетевой трафик или загрузку системы.
Третий шаг, который вы можете предпринять для минимизации риска, — это сканирование загруженных файлов с помощью антивирусного сканера
Это жизненно важно для защиты от распространённых вирусов и вредоносных программ, особенно если ваш сайт осуществляет файлообмен между разными людьми, как пример — вложения в веб-почтовый клиент или (юридический) сайт для обмена файлами. Существует расширение PHP, которое обеспечивает доступ к ClamAV, но, конечно, вы можете вызвать утилиту командной строки ClamAV так же, как я продемонстрировал для файла
PHP Создание HTML формы
Затем создайте HTML форму, позволяющую пользователям выбирать файл изображения, который они хотят загрузить:
<!DOCTYPE html><html><body><form action=»upload.php» method=»post»
enctype=»multipart/form-data»> Выберите изображение для загрузки: <input type=»file» name=»fileToUpload» id=»fileToUpload»> <input type=»submit» value=»Загрузить изображение» name=»submit»>
</form></body></html>
Некоторые правила, которым нужно следовать для HTML формы:
- Убедитесь, что форма использует
- Форма также нуждается в следующем атрибуте: .
Он указывает, какой тип контента использовать при отправке формы
Без вышеуказанных требований загрузка файла не будет работать.
Другие вещи, чтобы заметить:
Атрибут type=»file», тега ,
показывает поле ввода, как элемент управления выбор файла в «Браузере», кнопка рядом с элементом управления ввода
Форма отправляет данные в файл с именем «upload.php», что мы создадим дальше.
Создание формы загрузки
Следующий ниже код HTM создает форму для загрузки . Эта форма имеет атрибут метода, установленный для атрибута post и enctype, для которого установлено значение multipart / form-data
<?php if(isset($_FILES)){ $errors= array(); $file_name = $_FILES; $file_size =$_FILES; $file_tmp =$_FILES; $file_type=$_FILES; $file_ext=strtolower(end(explode('.',$_FILES))); $expensions= array("jpeg","jpg","png"); if(in_array($file_ext,$expensions)=== false){ $errors[]="extension not allowed, please choose a JPEG or PNG file."; } if($file_size --> 2097152){ $errors[]="File size must be excately 2 MB"; } if(empty($errors)==true){ move_uploaded_file($file_tmp,"images/".$file_name); echo "Success"; }else{ print_r($errors); } } ?> <form action="" method="POST" enctype="multipart/form-data"> <input type="file" name="image"> <input type="submit"> </form>
Подводим итоги и делаем выводы
Сегодня вы узнали, как происходит настройка и осуществляется процесс PHP загрузки файлов на сервер с вашего сайта или веб-приложения. Чтобы загрузка была успешной, форма HTML должна быть отправлена через запрос POST с множественным форматированием данных, а PHP должен разрешать передачу, как указано, с помощью директивы . После переноса файла, сценарий, ответственный за обработку загрузки, использует информацию, найденную в массиве , чтобы переместить файл из временного каталога в нужное место
Я также поделился некоторыми дополнительными мерами предосторожности, которые вы можете предпринять, чтобы защитить себя и своих пользователей от некоторых рисков, связанных с возможностью загрузки файлов. Чтобы гарантировать свою безопасность — проверяйте тип файла, наложите жесткие ограничения на загрузку трафика и применяйте сканирование на наличие вирусов