Как скачать файл через php
Перейти к содержимому

Как скачать файл через php

  • автор:

Загрузка файла на сервер и скачивание файла с сервера в PHP

С помощью PHP можно загружать файлы на сервер и скачивать файлы с сервера. То есть, с помощью PHP можно легко организовать хранилище файлов, галерею.
Разберём, как создать на PHP загрузчик файлов на сервер
Чтобы организовать загрузку файла на сервер в PHP скрипте, необходимо использовать multipart-форму с полем ввода типа file. В атрибуте формы enctype необходимо указать multipart/form-data
Общий вид формы загрузки файла в PHP





Здесь используется поле ввода для файла input type=»file» Использование этого поля отображает на веб странице форму загрузки файла. upload_file — это имя загружаемого файла.
форма загрузки файла в php
При обработке формы вся информация о файле в PHP записывается в глобальный массив $_FILES Основные значения глобального массива $_FILES:
$_FILES[‘upload_file’][‘name’] — имя файла до его отправки на сервер
$_FILES[‘upload_file’][‘size’] — размер загруженного файла в байтах;
$_FILES[‘upload_file’][‘type’] — тип загруженного файла
$_FILES[‘upload_file’][‘tmp_name’] — имя загруженного файла во временном каталоге
$_FILES[‘upload_file’][‘error’] — Код ошибки, которая может возникнуть при загрузке файла.
Указываем путь, куда необходимо загрузить файл
$переменная файла = «путь».$_FILES[‘upload_file’][‘name’];
Перед загрузкой файла в указанную папку, для безопасности он сохраняется во временную директорию. Путь к временному файлу указан в глобальном массиве $_FILES[‘upload_file’][‘tmp_name’]
Чтобы файл загрузить в нужную папку из временной директории, используем команду
move_uploaded_file($_FILES[‘upload_file’][‘tmp_name’], $переменная файла);
После загрузки файла делаем проверку на существование загружаемого файла и выводим информацию о загруженном файле.
if(isset($_FILES[‘upload_file’][‘name’]))
echo «Загруженный файл: «.$_FILES[‘upload_file’][‘name’].»
«;
echo «Размер: «.$_FILES[‘upload_file’][‘size’].»байт»;
>
Полный PHP код скрипта загрузчика файла. Для примера загружается файл с именем itrobo.jpg, после загрузки файла выводится информация о загруженном файле и загруженный файл на веб страницу.










$file = «upload/».$_FILES[‘upload_file’][‘name’];
move_uploaded_file($_FILES[‘upload_file’][‘tmp_name’], $file);
if(isset($_FILES[‘upload_file’][‘name’]))
echo «Загруженный файл: «.$_FILES[‘upload_file’][‘name’].»
«;
echo «Размер: «.$_FILES[‘upload_file’][‘size’].»байт»;
echo ‘

image

‘;
>
?>
Пример вывода скрипта на веб страницу
загрузка файла на сервер в php

itrobo

Скачивание файла с сервера с помощью PHP
Чтобы скачать файл с сервера в PHP, используется следующая конструкция
$переменная файла = путь к файлу;
header(‘Content-Type: тип файла);
header(‘Content-Disposition: attachment; filename=»имя файла»‘);
readfile($переменная файла);
Пример скачивания файла с сервера с помощью PHP
$file = ‘upload/itrobo.jpg’;
header(‘Content-Type: image/jpeg’);
header(‘Content-Disposition: attachment; filename=»itrobo.jpg»‘);
Напишем пример PHP скрипта, который выводит на веб страницу изображение с кнопкой «Загрузить!». При нажатии на кнопку «Загрузить!», картинка скачивается с веб сервера на компьютер.
Скрипты, в которых идёт вызов команды «Header», необходимо сохранять в кодировке UTF-8 без BOM. Это можно сделать с помощью редактора Notepad++. PHP обработчик следует писать в самом начале страницы.
Создаём HTML форму с кнопкой «Загрузить!». Она нужна для того, чтобы загрузить PHP обработчик скачивания файлов. Размещаем изображение на веб странице.




Тег для вывода изображения в форме. Подробнее о работе с формами в PHP




Напишем PHP обработчик кнопки Если кнопка нажата, скачиваем файл
if(isset($_POST[‘info’])) $file = ‘upload/itrobo.jpg’;
header(‘Content-Type: image/jpeg’);
header(‘Content-Disposition: attachment; filename=»itrobo.jpg»‘);
readfile($file);
>
?>

Полный код PHP скрипта для скачивания файла с сервера

if(isset($_POST[‘info’])) $file = ‘upload/flower.jpg’;
header(‘Content-Type: image/jpeg’);
header(‘Content-Disposition: attachment; filename=»itrobo.jpg»‘);
readfile($file);
>
?>



icon




Пример вывода скрипта на веб страницу
скачивание файла в php

Комментарии ( 0 )

Нет комментариев. Ваш будет первым!

Как скачать файл на PHP 2 мин для чтения

Как скачать файл на PHP

Как правило, для загрузки файла с расширениями exe и zip не требуется PHP-скрипт. Если местоположение файла этого типа файла задано в атрибуте href элемента привязки, то файл автоматически загружается, когда пользователь щелкает ссылку для загрузки. Некоторые файлы, такие как файлы изображений, файлы PDF, текстовые файлы, файлы CSV и т. Д., не загружаются автоматически, а вместо этого открываются в браузере, когда пользователь щелкает ссылку для загрузки. Эти файлы можно принудительно загрузить в PHP с помощью функции readfile(), которая не загружается автоматически. В этой статье показано, как принудительно загрузить любой файл с помощью сценария PHP.

Проверить ссылки для скачивания

Ранее упоминалось, что файлы zip и exe загружаются автоматически, без использования сценария PHP. Сначала создайте HTML-файл со следующим кодом. Здесь четыре элемента привязки определены для загрузки файлов четырех типов. Эти типы файлов включают файлы TEXT, ZIP, PDF и JPG.

  Скачивать файлы  

Скачать файл TEXT

Скачать файл ZIP

Скачать файл PDF

Скачать файл JPG

После нажатия ссылки на zip-файл появится следующее диалоговое окно для загрузки файла. Затем пользователь может загрузить файл или открыть файл в диспетчере архивов.

Если вы щелкните файл изображения, оно автоматически откроется в браузере, как показано в следующем выводе. Вы должны сохранить файл, чтобы сделать копию файла образа на локальном диске. Таким же образом, когда вы нажимаете ссылки на файлы PDF и TEXT, содержимое файла открывается в браузере без загрузки файла. Решение этой проблемы — принудительно загрузить файл с помощью встроенной функции PHP readfile().

Загрузить файл с помощью функции readfile()

Функция readfile() используется в сценарии PHP для принудительной загрузки любого файла из текущего местоположения или файла с путем к файлу. Синтаксис этой функции приведен ниже.

Читать Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Решение головоломки судоку. Часть 4.2

int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )

Эта функция может принимать три аргумента. Первый аргумент является обязательным, а два других аргумента — необязательными. Первый аргумент, $filename, хранит имя файла или имя файла с путем, который будет загружен. Значение по умолчанию второго параметра, $use_include_path, равно false и будет установлено в true, если имя файла с путем используется в первом аргументе. Третий аргумент, $context, используется для указания ресурса потока контекста. Эта функция возвращает количество байтов, прочитанных из файла, указанного в первом аргументе. Использование этой функции показано в следующих двух примерах.

Пример 1: Загрузить файл с именем файла

В этом примере мы создадим HTML-файл со следующим кодом, в котором имя файла будет передано в качестве параметра URL-адреса с именем path, а значение этого параметра будет передано в файл PHP с именем download.php.

  Скачивать файлы  

Скачать файл TEXT

Скачать файл ZIP

Скачать файл PDF

Скачать файл JPG

Мы создадим файл PHP со следующим кодом для принудительной загрузки файла. Здесь функция isset() используется для проверки, определен ли $_GET [‘path’]. Если переменная определена, функция file_exists() используется для проверки, существует ли файл на сервере. Затем функция header() используется для установки необходимой информации заголовка перед использованием функции readfile(). Функция basename() используется для получения имени файла, а функция sizes() используется для чтения размера файла в байтах, который будет показан в открывшемся диалоговом окне для загрузки файла. функция flush()используется для очистки буфера вывода. Здесь функция readfile() используется только с именем файла.

 else < echo "Файл не существует."; >> else echo "Имя файла не определено." ?>

Читать onClick в JavaScript

Выходные данные появятся после щелчка по ссылке для загрузки файла изображения. Размер файла изображения rose.jpg составляет 27,2 КБ, как показано в диалоговом окне. Вы можете загрузить файл, установив переключатель «Сохранить файл» и нажав кнопку OK.

Пример 2: Загрузить файл с указанием пути к файлу

Если файл существует в указанном месте, путь к файлу необходимо указать в URL-адресе. В этом примере мы создадим HTML-файл со следующим кодом, который будет передавать имя файла с путем к файлу:

  Скачать файлы  

Скачать PDF file

Скачать JPG file

Мы создадим файл PHP со следующим кодом, чтобы загрузить файл по пути к файлу. Код PHP в предыдущем примере будет немного изменен для загрузки файла по заданному пути. Функция clearstatecache() используется для очистки кеша, который был ранее сохранен. В функции readfile() используются два аргумента.

 else < echo "Путь к файлу не существует."; >> echo "Путь к файлу не определен." ?>

Вывод

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Загрузка файлов на сервер

В прошлом уроке мы научились работать с файлами в PHP, а именно – читать и писать данные в файлы. Теперь давайте рассмотрим возможность языка PHP, позволяющую загружать пользователю файлы на сервер.

Для начала давайте обговорим, как будет выглядеть наше мини-приложение. Пусть у нас будет форма для загрузки файлов: upload.php. Этот же файл будет содержать логику по обработке загружаемых пользователем файлов. И ещё давайте создадим папку uploads, в которую будем складывать все загружаемые файлы.

Давайте для начала напишем саму форму для загрузки файла. Она ничем не отличается от обычной формы для POST-запроса. Единственное отличие – появляется input со специальным типом file. У него также как и у текстового input’а есть атрибут name. Простейшая форма для загрузки файла будет выглядеть следующим образом. Содержимое файла upload.php:

  Загрузка файла   

Для того, чтобы начать работать с файлом на стороне PHP, нужно познакомиться с ещё одним суперглобальным массивом в PHP — $_FILES. Так как мы указали в input атрибуту name значение attachment, то и узнать информацию о загружаемом нами файле можно получить по соответствующему ключу — $_FILES[‘attachment’].

  • Курс HTML для начинающих
  • Курс PHP для начинающих
  • Курс MySQL для начинающих
  • Курс ООП в PHP

Давайте разместим PHP-код для обработки загружаемого файла в этом же файле. Для начала просто посмотрим что у нас там вообще есть с помощью var_dump.

 ?>  Загрузка файла   

выбор файла для загрузки

Откроем в браузере нашу форму http://myproject.loc/upload.php, и выберем какой-нибудь файл для загрузки. Я для этого выбрал картинку, валяющуюся на рабочем столе.

Суперглобальный массив <img decoding=

После нажатия на кнопку «Отправить» мы получим содержимое массива $_FILES.
FILES» />FILES» />

  • Тест на знание основ HTML
  • Тест на знание основ PHP
  • Тест на знание ООП в PHP

Значение $_FILES[‘attachment’] представляет собой массив с пятью ключами. Давайте рассмотрим каждый из элементов этого массива более подробно.

  • name – имя файла, переданное из браузера;
  • type – тип файла, в моём случае это image/png;
  • tmp_name – путь до временного файла, который загрузился на сервер, но если с ним до конца запроса ничего не сделать, то он удалится;
  • error – код ошибки при загрузке файла, если 0 – то ошибки нет. Изучите возможные коды ошибок вот тут;
  • size – размер загруженного файла в байтах.

Как мы уже сказали, пока что на сервере создан временный файл. Чтобы его сохранить нужно вызвать специальную функцию, которая переместит его из временной папки в нужную нам папку (в нашем случае это папка uploads). Эта функция — move_uploaded_file(). Первым аргументом она принимает путь до временного файла (в нашем случае — $_FILES[‘attachment’][‘tmp_name’]), а вторым аргументом – путь, по которому нужно его сохранить. Функция вернёт true, если всё ок, и false, если что-то пошло не так.

ВНИМАНИЕ! Для перемещения временного файла в нужную вам папку стоит всегда использовать функцию move_uploaded_file(). Она предварительно проверяет, что указанный файл действительно является временным загруженным файлом, а не чем-то ещё. Другие функции для копирования файлов не подойдут, так как они эту проверку не выполняют, а это небезопасно. Кому интересно – можете подробнее прочитать тут.

В простейшем виде скрипт для загрузки файла на сервер будет выглядеть следующим образом.

 else < $result = 'http://myproject.loc/uploads/' . $srcFileName; >> ?>  Загрузка файла        

Результат загрузки файла через PHP

Если сейчас выбрать файл и нажать на кнопку “Отправить”, то скрипт вернёт нам адрес загруженного файла.

Мы можем открыть этот адрес в новой вкладке, и убедиться, что действительно файл доступен по этому адресу. Ну и если посмотрим в папку uploads, то тоже увидим, что наш файлик теперь там валяется.

Этот скрипт ещё очень сырой, давайте его доработаем.

Проверка на существующий файл с таким же именем

Первое, что приходит на ум – убедиться, что файл с таким именем не загружался ранее. Иначе мы рискуем перезатереть что-нибудь важное. Давайте проверим существование такого файла с помощью функции file_exists().

 elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) < $error = 'Ошибка при загрузке файла'; >else < $result = 'http://myproject.loc/uploads/' . $srcFileName; >> ?> . 

Обработка ошибок при загрузке файлов

Теперь вспомним об элементе массива по ключу error. Как мы помним, при отсутствии ошибок там будет 0. Во всех остальных случаях стоит уведомить пользователя об ошибках при загрузке файла. Если мы прочитаем вот эту страничку документации, то увидим, что ошибки на самом деле могут быть самыми разными.

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

 elseif (file_exists($newFilePath)) < $error = 'Файл с таким именем уже существует'; >elseif (!move_uploaded_file($file['tmp_name'], $newFilePath)) < $error = 'Ошибка при загрузке файла'; >else < $result = 'http://myproject.loc/uploads/' . $srcFileName; >> ?> . 

Проверяем расширение загружаемого файла

Ещё необходимо проверить то, что у загружаемого файла корректное расширение. Например, если мы хотим чтобы через форму загружали только картинки, то допустимыми расширениями для нас будут .jpg, .gif, .png.

Если этого не предусмотреть – то через форму загрузки можно будет загрузить какой-нибудь вредоносный скрипт. Представьте, что кто-то загрузил на сервер .php-скрипт, который удаляет все файлы в текущей директории, а затем просто запустил его, зайдя по адресу http://myproject.loc/uploads/very_bad_script.php. И это еще не самое страшное, что могут сделать злобные хакеры. Поэтому нужно всегда контролировать то, что пользователи загружают на сервер.

Получить расширение файла можно при помощи функции pathinfo(). Первым аргументом передаётся путь до файла, вторым – константа PATHINFO_EXTENSION.

$extension = pathinfo($srcFileName, PATHINFO_EXTENSION);

В переменной $extension после это будет строка c расширением загруженного файла, например, png.
Нам остаётся только проверить, что расширение загружаемого файла находится в списке разрешенных. Давайте создадим массив со списком таких расширений и проверим наличие расширения загружаемого файла в списке разрешенных.

$allowedExtensions = ['jpg', 'png', 'gif']; $extension = pathinfo($srcFileName, PATHINFO_EXTENSION); if (!in_array($extension, $allowedExtensions))

Ошибка при плохом расширении

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

Результат

В ходе данного урока получили скрипт следующего содержания.

 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; >> ?>  Загрузка файла        

Есть ещё несколько проверок, которые было бы неплохо провести, прежде чем позволить загрузить файл на сервер. О них вы узнаете в домашнем задании.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *