Как сделать скачивание файла с сайта php
Скачивание файлов php
Ниже в этой статье вы можете увидеть универсальный скрипт для скачивание файлов на php, но давайте рассмотрим одну проблему и как скрипт её устраняет.
Если этот скрипт покажется вам сложным, советую посмотреть, как на простом примере реализуется скрипт cкачивания изображений и текстовых файлов на php.
Многие пользователи сталкиваются с одной необычной проблемой. К примеру необходимо реализовать скачивания mp3-файлов. С одной стороны, сделать это очень просто: необходимо лишь реализовать скрипт загрузки файлов, который также будет вести подсчет числу скачиваний.
После проверки выясняется, что файлы без проблем скачиваются. Однако вскоре возникает одна проблема: Internet Explorer не спрашивает, скачать файл или просто открыть, а запускает медиа-плеер.
Та же проблема встречается с файлами и других форматов. Пользователям не всегда нужно, чтобы файлы pdf, doc или gif способствовали открытию соответствующих программ. Для решения этой проблемы существует PHP-скрипт, предназначенный для скачивания файлов.
PHP скрипт для скачивания файлов:
Этот скрипт будет делать пользователям запрос, которые смогут выбрать, сохранить тот или иной файл или открыть его. Вам необходимо создать файл dl_save.php, а затем скопировать в него нужный код. Ссылка, которая ведет на скачивание файла, выглядит примерно следующим образом:
Ссылку на скачивания файла оформлять нужно (примерно) так:
PHP class для скачки и закачки файлов на сервер
Предисловие
В интернете есть много информации о том как скачивать файлы с сервера и загружать файлы на сервер, а также между серверами. Но нигде нет простого решения которое было бы более ли менее универсально.
И лишь благодаря единичным статьям, кусочкам информации с форумов и всяким комментариям удалось собрать пазл воедино. Я не утверждаю что мое решение полностью универсально, но очень удобное во многих случаях, хотя это вам решать.
Если у кого-либо возникнет желание улучшить мое решение этого вопроса и хватает знаний в этом направлении, то я буду рад, если вы сделаете какие-либо исправления или добавления к коду который лежит в открытом доступе на GitHub.
А теперь к делу, функции класса CargaDes:
Для начала нужно скачать и подключить класс CargaDes:
1. Отдача файла через браузер без показа его места хранения с возможностью докачки и регулирования скорости
Этот метод очень похож на Drupal и иже с ним:
Я добавил еще отдачу с помощью Apache, но должна быть включена директива XSendFile On
Сразу после выполнения метода браузер выдаст окно для сохранения файла
2. Загрузка файла/ов на сервер через браузер с индикатором прогресса
После выполнения метода появится кнопка для выбора файлов и кнопка для загрузки файлов. Индикатор будет появляться для каждого выбранного файла в отдельности.
3. Скачивание файлов с удаленного сервера на свой сервер
4. Отдаем файл на удаленный сервер со своего сервера
По итогу хочу сказать
Если этот класс поможет хотя бы одному человеку я буду очень рад этому. Как я уже говорил в начале буду рад конструктивной критике и дополнениям которые могут привести к улучшению класса. Ссылка на CargaDes.class.
Изменил в статье способы использования класса. И добавил описание того что изменилось в классе.
Вот закончил работу над ошибками, если это можно так назвать.
Что было не сделано:
В целом я постарался исправить, то о чем говорили в комментариях, если будут найдены еще какие либо недочеты или ошибки — пишите постараюсь исправить.
Благодарю за конструктивную критику webdevium и alutskevich, если бы мог, то плюсанул бы вам обязательно.
Так же благодарю всех остальных т.к. у меня появилось понимание моей главной ошибки и родилось пару идей.
Отдаем файлы эффективно с помощью PHP
1. Используем readfile()
Метод хорош тем, что работает с коробки. Надо только написать свою функцию отправки файла (немного измененный пример из официальной документации):
Таким способом можно отправлять даже большие файлы, так как PHP будет читать файл и сразу отдавать его пользователю по частям. В документации четко сказано, что readfile() не должен создавать проблемы с памятью.
2. Читаем и отправляем файл вручную
Метод использует тот же Drupal при отправке файлов из приватной файловой системы (файлы недоступны напрямую по ссылкам):
3. Используем модуль веб сервера
3a. Apache
Модуль XSendFile позволяет с помощью специального заголовка передать отправку файла самому Apache. Существуют версии по Unix и Windows, под версии 2.0.*, 2.2.* и 2.4.*
В настройках хоста нужно включить перехват заголовка с помощью директивы:
Также можно указать белый список директорий, файлы в которых могут быть обработаны. Важно: если у Вас сервер на базе Windows путь должен включать букву диска в верхнем регистре.
Описание возможных опций на сайте разработчика: https://tn123.org/mod_xsendfile/
Пример отправки файла:
3b. Nginx
Nginx умеет отправлять файлы из коробки через специальный заголовок.
Для корректной работы нужно запретить доступ к папку напрямую через конфигурационный файл:
Пример отправки файла (файл должен находиться в директории /some/path/protected):
Скачать файл с URL, используя PHP
Существует множество подходов для загрузки файла с URL-адреса, некоторые из них обсуждаются ниже:
Способ 1: использование функции file_get_contents () : функция file_get_contents () используется для чтения файла в строку. Эта функция использует методы отображения памяти, которые поддерживаются сервером, и, таким образом, повышает производительность, делая ее предпочтительным способом чтения содержимого файла.
Синтаксис:
Программа 1:
// Инициализируем URL файла в переменную
// Используем функцию basename () для возврата базового имени файла
// Используем функцию file_get_contents () для получения файла
// из url и используем функцию file_put_contents () для
// сохранить файл, используя базовое имя
echo «File downloaded successfully» ;
echo «File downloading failed.» ;
Выход:
Перед запуском программы:
После запуска программы:
Метод 2: Использование PHP Curl: cURL расшифровывается как «Клиент для URL», первоначально с URL, прописанным в верхнем регистре, чтобы было очевидно, что он имеет дело с URL. Это произносится как «см. URL». В проекте cURL есть два продукта libcurl и curl.
Шаги для загрузки файла:
Пример:
// Инициализируем URL файла в переменную
// Инициализируем сессию cURL
// Инициализировать имя каталога, где
// файл будет сохранен
// Используем функцию basename () для возврата
// базовое имя файла
// Сохранить файл в папку
// Он устанавливает опцию для передачи cURL
// Выполнить сеанс cURL
// Закрывает сеанс cURL и освобождает все ресурсы
Выход:
Перед запуском программы:
После запуска программы:
Загрузка файлов на сайт: PHP, AJAX, HTML5 и Drag’n’Drop
Скучные формы загрузки — прошлый век. HTML5 дает возможности, чтобы добавить Drag’n’Drop, а AJAX позволяет загружать файлы без обновления страницы.
Программисту нужно позаботиться о том, чтобы посетитель смог сделать это максимально удобно. Загрузить файл на сайт можно и с помощью обычной формы и обработчика на PHP, но с выходом HTML5 появились другие интересные возможности — в этой статье мы поговорим и о базовых функциях, и о нововведениях.
Загрузка файлов на PHP
Начать следует с создания формы:
Для тега мы указываются следующие атрибуты:
Во второй тег добавляется атрибут multiple и имя file[] — это позволит с помощью одного поля загрузить сразу несколько файлов. Также в коде присутствует div, в который позже будет выводиться сообщение.
Далее указываются стили CSS:
И вот как это выглядит:
Сначала нужно провести несколько проверок, и только потом перемещать файлы из временного хранилища непосредственно на сайт. Иначе может получиться так, что взломщики загрузят на сайт PHP-файлы и смогут их запустить, чтобы получить доступ к базе данных или к файловой системе сервера.
Вот как выглядит обработчик:
Если загрузка прошла успешно, создается массив разрешенных типов, по которому проверяется соответствие форматов. Затем, если валидация пройдена, с помощью функции move_uploaded_file файл перемещается из временного хранилища в указанную директорию.
Такой код хоть и работает, но он довольно примитивен и его нужно расширять:
В общем, стоит провести несколько дополнительных проверок, чтобы файлы не представляли угрозу для сайта и не валялись без дела.
Загрузка файлов на сайт с помощью AJAX
Если добавить возможности JavaScript, форму можно сделать полезнее и красивее. Например, можно будет загружать файлы через AJAX, а также добавить анимацию при перетаскивании:
Функция получает файлы с помощью объекта FormData, затем показывает сообщение, что началась загрузка, и начинает отправлять файл.
Вот как работает загрузка файлов на AJAX:
Заключение
Дальше с файлами можно делать все что угодно:
Это лишь малая часть возможностей PHP — подробнее узнать о них всех можно из курса «PHP-разработчик», в котором сильная теоретическая база закрепляется сложными, но интересными практическими задачами.
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.