Как отправить файл для скачивания php

Обновлено: 21.11.2024

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

Настройте параметры PHP

Есть несколько параметров конфигурации PHP, которые необходимо заранее проверить на предмет успешной загрузки файлов. В этом разделе мы рассмотрим все важные параметры загрузки файла PHP. Эти параметры можно настроить в файле php.ini.

Если вы не знаете, где найти файл php.ini, вы можете использовать функцию php_ini_loaded_file(), чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его в браузере.

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

Основные настройки

загрузки_файлов

Значение директивы file_uploads должно быть установлено на On, чтобы разрешить загрузку файлов. Значение по умолчанию для этой директивы — On .

upload_max_filesize

Директива upload_max_filesize позволяет настроить максимальный размер загружаемого файла. По умолчанию установлено значение 2M (два мегабайта), и вы также можете переопределить этот параметр с помощью файла .htaccess. Два мегабайта — это не так много по сегодняшним меркам, поэтому вам, возможно, придется увеличить это значение. Если вы получаете сообщение об ошибке, что файл превышает upload_max_filesize при попытке загрузить файл, вам необходимо увеличить это значение. Если вы это сделаете, не забудьте также увеличить post_max_size (см. ниже).

upload_tmp_dir

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

максимальный_размер сообщения

Директива post_max_size позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью запросов POST, это значение должно быть больше, чем то, что вы установили для директивы upload_max_filesize. Например, если ваш upload_max_filesize равен 16 МБ (16 МБ), вы можете установить значение post_max_size равным 20 МБ .

max_file_uploads

Это позволяет вам установить максимальное количество файлов, которые можно загрузить за один раз. Значение по умолчанию – 20 – разумное количество.

max_input_time

Это максимальное количество секунд, в течение которого скрипту разрешено анализировать входные данные. Вы должны установить разумное значение, если вы имеете дело с загрузкой больших файлов. 60 (60 секунд) — хорошее значение для большинства приложений.

memory_limit

Директива memory_limit указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам нужно убедиться, что значение этой директивы больше, чем то, что вы установили для директивы post_max_size. Значение по умолчанию – 128 М (128 мегабайт), поэтому, если у вас не очень большие значения post_max_size и upload_max_filesize , вам не о чем беспокоиться.

максимальное_время_исполнения

Это максимальное количество секунд, в течение которого скрипт может выполняться. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вы можете увеличить это значение. 30 (30 секунд) подойдет для большинства приложений.

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

Создать HTML-форму

После того как вы настроили параметры PHP, вы готовы опробовать возможности загрузки файлов PHP.

В нашем репозитории GitHub есть примеры кода, которые я буду обсуждать в этой статье. Итак, если вы хотите продолжить, загрузите его с GitHub.

Мы собираемся создать два файла PHP: index.php и upload.php. Файл index.php содержит код, отвечающий за отображение формы загрузки файла. С другой стороны, файл upload.php отвечает за загрузку файла на сервер.

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

В этом разделе мы рассмотрим ключевые части файла index.php.

Давайте посмотрим на файл index.php на GitHub:

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

CSS в основном скрывает ввод исходного файла и стилизует сопровождающие его элементы span и label.

Хотя это может выглядеть как типичная форма PHP, существует важное отличие в значении атрибута enctype тега. Необходимо установить значение multipart/form-data, так как форма содержит поле файла.

Атрибут enctype указывает тип кодировки, который следует использовать при отправке формы, и принимает одно из следующих трех значений:

  • application/x-www-form-urlencoded : это значение по умолчанию, если вы не устанавливаете значение атрибута enctype явно. В этом случае символы кодируются перед отправкой на сервер.Если в форме нет поля файла, следует использовать это значение для атрибута enctype.
  • multipart/form-data : использование значения multipart/form-data для атрибута enctype позволяет загружать файлы методом POST. Кроме того, он гарантирует, что символы не будут закодированы при отправке формы.
  • text/plain : обычно не используется. При использовании этого параметра данные отправляются в незакодированном виде.

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

Кроме того, мы отобразили сообщение в верхней части формы. Это сообщение показывает статус загрузки файла, и он будет установлен в переменной сеанса сценарием upload.php. Подробнее об этом мы поговорим в следующем разделе.

Итак, это подводит итог файлу index.php. В следующем разделе мы увидим, как обрабатывать загруженный файл на стороне сервера.

Создайте логику загрузки

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

Вставьте код из файла upload.php на GitHub. Мы рассмотрим важные части этого файла.

В файле upload.php мы в первую очередь проверили, является ли запрос POST допустимым.

В PHP при загрузке файла суперглобальная переменная $_FILES заполняется всей информацией о загруженном файле. Он инициализируется как массив и может содержать следующую информацию для успешной загрузки файла.

  • tmp_name : в этой переменной хранится временный путь, по которому загружается файл.
  • name : в этой переменной хранится фактическое имя файла.
  • size : указывает размер загруженного файла в байтах.
  • type : содержит MIME-тип загруженного файла.
  • error : если во время загрузки файла возникает ошибка, эта переменная заполняется соответствующим сообщением об ошибке. В случае успешной загрузки файла он содержит 0, что можно сравнить с помощью константы UPLOAD_ERR_OK.

После проверки запроса POST мы проверяем, что загрузка файла прошла успешно.

Вы можете видеть, что переменная $_FILES представляет собой многомерный массив, первый элемент которого представляет собой имя поля файла, а второй элемент содержит информацию о загруженном файле, как мы только что обсуждали выше.< /p>

Если загрузка файла прошла успешно, мы инициализируем несколько переменных информацией о загруженном файле.

В приведенном выше фрагменте мы также выяснили расширение загруженного файла и сохранили его в переменной $fileExtension.

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

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

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

Функция move_uploaded_file принимает два аргумента. Первый аргумент — это имя загруженного файла, а второй аргумент — путь назначения, куда вы хотите переместить файл.

Наконец, мы перенаправляем пользователя к файлу index.php. Также задаем в переменной сессии соответствующее сообщение, которое будет отображаться пользователям после перенаправления в файле index.php.

Как все это работает вместе

Не забудьте создать каталог uploaded_files и сделать его доступным для записи пользователю веб-сервера. Затем запустите файл index.php, который должен отобразить форму загрузки файла, которая выглядит следующим образом:

Нажмите кнопку «Обзор». Откроется диалоговое окно, позволяющее выбрать файл на вашем компьютере. Выберите файл с одним из разрешенных в нашем скрипте расширений и нажмите кнопку Загрузить.

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

Устранение распространенных ошибок

Во время загрузки файла многое может пойти не так, что может привести к ошибкам. Вы можете проверить точную ошибку, которая произошла во время загрузки, используя $_FILES['uploadedFile']['error'] . Вот объяснение этих ошибок:

Файл слишком большой

UPLOAD_ERR_INI_SIZE и UPLOAD_ERR_FORM_SIZE возникают, когда размер загружаемого файла превышает значение, указанное в php.ini или форме HTML соответственно. Вы можете избавиться от этой ошибки, увеличив ограничения на размер загрузки или заранее сообщив об этом пользователям.

Временная папка отсутствует

Сообщается об отсутствии временной папки для загрузки файла UPLOAD_ERR_NO_TMP_DIR. UPLOAD_ERR_NO_FILE сообщается, когда нет файла для загрузки.

Частичная загрузка или не удается записать на диск

Вы получите UPLOAD_ERR_PARTIAL, если файл удалось загрузить только частично, и UPLOAD_ERR_CANT_WRITE, если файл не удалось записать на диск.

Расширение PHP остановило загрузку файла

Иногда вы получаете сообщение об ошибке UPLOAD_ERR_EXTENSION, потому что какое-то расширение остановило загрузку файла. Это потребует от вас дополнительных исследований, чтобы выяснить, какое расширение вызвало проблему.

Вот полный код из upload.php, который покажет пользователям сообщение на странице загрузки в случае успеха или неудачи загрузки. Информация об успешной или неудачной загрузке хранится в $_SESSION['message'] .

Изучите PHP с помощью бесплатного онлайн-курса

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

Если вы хотите узнать больше о PHP, ознакомьтесь с нашим бесплатным онлайн-курсом по основам PHP!

В этом курсе вы изучите основы программирования на PHP. Вы начнете с основ, узнаете, как работает PHP, и напишете простые циклы и функции PHP. Затем вы перейдете к классам программирования для простого объектно-ориентированного программирования (ООП). Попутно вы освоите все самые важные навыки написания приложений для Интернета: у вас будет возможность попрактиковаться в ответах на запросы GET и POST, синтаксическом анализе JSON, аутентификации пользователей и использовании базы данных MySQL.

Привет! В этом уроке я покажу вам, как загружать, просматривать и скачивать файлы в php и mysql. Процесс загрузки файла аналогичен тому, что мы обсуждали здесь, но этот php-скрипт не только загружает файл на сервер, но также сохраняет путь к файлу и дату его создания в базе данных mysql. Помимо загрузки файла, он также дает вам возможность просмотреть файл в браузере и загрузить его с сервера.

С помощью PHP вы можете практически загружать файлы любого типа, а сценарий загрузки файлов, который я представил ниже, будет работать для всех типов файлов, таких как PDF, документы, изображения, MP3, видео, Zip-архивы и т. д. Просто включите эти расширения файлов в процесс фильтрации (массив $allowed), и вы сможете их загружать.

Как загрузить, просмотреть и скачать файл в PHP и MySQL?

Перейдем к кодированию. Сначала вы должны создать базу данных mysql для хранения сведений о файлах.

Создать базу данных MySQL:

Далее идет сценарий подключения к базе данных, который устанавливает соединение с базой данных mysql из php.

dbconnect.php

Затем создайте index.php — это основной файл, содержащий пользовательский интерфейс. Он имеет форму загрузки и html-таблицу для отображения списка загруженных файлов из базы данных вместе со ссылками «Просмотр» и «Скачать» для них.

index.php

Примечание. В этой демонстрации используется twitter bootstrap для таблицы стилей css.

Запуск index.php создаст страницу с формой загрузки и таблицей с информацией о файлах, подобной этой. Пользователи могут щелкнуть ссылку «Просмотр», чтобы просмотреть файлы в браузере, или «Загрузить», чтобы загрузить файлы с сервера.

Наконец есть файл 'uploads.php', который будет выполняться при отправке формы для загрузки выбранного файла. Здесь мы фактически загружаем файл на сервер с клиентского компьютера и сохраняем его имя и дату загрузки в базу данных.

uploads.php

Этот скрипт загружает файл с локального компьютера на сервер, сохраняет его данные в базе данных и перенаправляет на index.php. Если все пойдет правильно, вы сможете увидеть сообщение об успешном завершении.

Если есть какая-либо ошибка, вы будете уведомлены об этом.

Итак, мы рассмотрели загрузку файлов, а также их просмотр и загрузку с использованием баз данных php и mysql. Если вы хотите, вы можете установить ограничение на размер файла или запретить пользователям загружать только pdf или изображения и т. д.

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

Скачивание файлов с помощью PHP

Обычно вам не обязательно использовать какой-либо серверный язык сценариев, такой как PHP, для загрузки изображений, zip-файлов, pdf-документов, exe-файлов и т. д. Если такой файл хранится в общедоступной папке, вы можете просто создайте гиперссылку, указывающую на этот файл, и всякий раз, когда пользователь нажимает на ссылку, браузер автоматически загружает этот файл.

Пример

Нажатие ссылки, указывающей на файл PDF или файл изображения, не приведет к его прямой загрузке на жесткий диск. Он откроет файл только в вашем браузере. Далее вы можете сохранить его на жесткий диск. Однако по умолчанию файлы zip и exe загружаются на жесткий диск автоматически.

Принудительная загрузка с помощью PHP

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

Давайте создадим файл с именем "image-gallery.php" и поместим в него следующий код.

Пример

Если вы внимательно посмотрите на приведенный выше пример кода, вы обнаружите, что ссылка для скачивания ведет к файлу "download.php", URL-адрес также содержит имя файла изображения в виде строки запроса. Кроме того, мы использовали функцию PHP urlencode() для кодирования имен файлов изображений, чтобы их можно было безопасно передавать в качестве параметра URL, поскольку имена файлов могут содержать небезопасные символы URL.

Вот полный код файла "download.php", который вызывает загрузку изображения.

Пример

Точно так же вы можете принудительно загрузить другие форматы файлов, такие как word doc, pdf и т. д.

Регулярное выражение в приведенном выше примере (строка № 8) просто не разрешает те файлы, имя которых начинается или заканчивается символом точки ( . ), например, разрешает имена файлов например kites.jpg или Kites.jpg , myscript.min.js, но не разрешайте kites.jpg. или .kites.jpg .

Пожалуйста, ознакомьтесь с учебным пособием по регулярным выражениям, чтобы более подробно изучить регулярные выражения.

В этом руководстве показано, как вы можете загружать файлы различных форматов, включая .zip, .pdf, .docx, .ppt, а также файлы изображений через форму с использованием PHP для хранения в папке на нашем сервере.

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

Создайте новую папку проекта PHP и назовите ее file-upload-download . Создайте в этой папке подпапку с именем uploads (здесь будут храниться наши загруженные файлы) и файл с именем index.php .

index.php — это место, где мы создадим форму загрузки файла. Откройте его и поместите в него этот код:

Это очень простая форма, которая содержит только поле ввода для нашего файла и кнопку загрузки.

В разделе заголовка мы ссылаемся на наш файл style.css, чтобы придать нашей форме некоторые стили. Создайте этот файл в корне нашего приложения и добавьте в него этот код CSS:

В верхней части index.php мы включаем файл filesLogic.php. Это файл, который содержит всю логику получения нашего отправленного файла и его сохранения в папке для загрузки, а также хранения информации о файле в базе данных. Давайте сейчас создадим этот файл.

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

Создайте новую базу данных с именем file-management. В этой базе данных создайте таблицу с именем files и задайте для нее следующие поля.

  • идентификатор — INT
  • имя - VARCHAR(255)
  • размер — INT
  • загрузки

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

Примечание. В зависимости от конфигурации php ваш файл может не загрузиться, если его размер превышает значение upload_max_filesize, установленное в файле php.ini. Вы всегда можете настроить эту информацию в файле php.ini. Увеличьте значения post_max_size и upload_max_filesize .

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

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

Откройте filesLogic.php и добавьте эти 3 строки кода чуть ниже строки, где мы подключаемся к базе данных:

Это выбирает информацию обо всех файлах из базы данных и устанавливает ее в переменную массива с именем $files.

Теперь создайте файл с именем downloads.php в корневой папке нашего приложения и добавьте в него этот код:

Теперь на этой странице информация о файлах из базы данных указана вместе с их размером в КБ и количеством загрузок. Рядом с каждым файлом есть кнопка загрузки. Теперь остается код, который фактически загружает файл из нашей папки загрузок. Давайте сразу напишем код.

Снова откройте filesLogic.php и добавьте этот код в конец файла:

Когда мы составляли список файлов, к каждой кнопке загрузки (точнее, ссылке для скачивания) был прикреплен параметр с именем file_id. Поэтому, когда вы нажимаете на ссылку загрузки файла, идентификатор этого файла отправляется на страницу filesLogic.php и захватывается этим фрагментом кода, который мы только что добавили.

Затем код извлекает информацию об этом конкретном файле из базы данных с помощью параметра file_id, а затем сохраняет информацию о файле в переменной с именем $file . Используя метод PHP file_exists() с полным путем к нашему файлу в качестве аргумента, мы проверяем, действительно ли файл существует в нашей папке для загрузки. Затем мы приступаем к установке некоторых заголовков и, наконец, отвечаем файлом пользователю, используя функцию readFile() в PHP.

После загрузки файла мы обновляем количество загрузок для этого конкретного файла в базе данных.

Заключение

Это все, что касается загрузки и скачивания файлов. Вы можете дополнительно настроить его для создания классных приложений PHP. Большое спасибо за внимание. Дайте мне знать, что вы думаете об этой статье в разделе комментариев ниже, если хотите.

Читайте также: