Php как получить ссылку на файл
Путь на сервере до файла через php, выведем на экран ! Вообще получим путь на сервере до файла разными способами!
Все о пути на сервере до файла на сайте
-
-> теория -> без php -> глобальная переменная -> __FILE__ -> PHP_URL_PATH
Что такое путь до файла на сервере -> теория
Иногда, очень трудно понять, что означают те или иные значения! Как можно объяснить по простому, Что такое путь до файла на сервере!?Давайте посмотрим в адресную строку и там вы увидите ссылку на файл и выше выделенного красным, вы не сможете подняться, это домен или по-другому можно его обозвать -> корневая папка, но данный путь на корневой папке не останавливается.
Выше есть еще несколько папок, с разной степенью доступа! И если мы весь путь, который существует выше корневой папки поставим вместо домена. то получим путь на сервере до файла home/domen/dwweb_ru/www /page/php/096_put_na_servere_do_fayla_php.html И если вы используете php, то вам все равно придется использовать путь на сервере до файла, потому, что многие функции работают только с файлом, к которому прописан путь на сервереПолучить путь до файла на сервере
Можно ли получить путь до файла на сервере без php!? Можно, но зачем!? Предположим, что у вас нет php!? Очень странно, но возможно! Никогда такой херней не занимался, но что не сделаешь для своих любимых пользователей.У меня только единственный способ . кроме обращения в тех поддержку.
Заходим в админку, поскольку я не умею гадать, то заходим в свою админку сайта, у нас это DIRECTADMIN на ruweb - е
Ищем вкладку создать ftp аккаунт.
После того, как вы попали на новую вкладку опять нажимаем ftp аккаунт
Получить путь до файла на сервере
Далее выбираем первый чекбокс и внизу видим путь на сервер до корневой папки:
Получить путь до файла на сервере
Получить путь до файла на сервере -> способ №1
Да! Напоминаю, что в зависимости от структуры вашего сервера, и будет зависеть путь до файла на сервереДля того, чтобы получить путь до файла на сервере нам понадобится, путь на сервере до корневой папки
Далее нам понадобится путь от корневой, до файла:
Теперь соберем все вместе и выведем через echo
И получим путь на сервере до файла через глобальную переменную $_SERVER
home/domen/dwweb_ru/www/page/php/096_put_na_servere_do_fayla_php.htmlНо у данной переменной есть некоторый минус, она вам покажет все, что есть после расширения, например get запрос.
Давайте сделаем живой пример и создадим ссылку с гет запросом нажмите по ссылке и посмотрите ниже пункта 4, что прибавилось в строке. выделено красным:
Как получить путь на сервере до файла с помощью -> __FILE__
Для того, чтобы получить путь на сервере до файла с помощью __FILE__, нам потребуется в самом файле установить код php!
Прямо здесь, выведем вот такую конструкцию получения всего пути на сервере до файла:
Пример вывода пути до файла на сервере:
home/domen/dwweb_ru/www/page/php/096_put_na_servere_do_fayla_php.htmlПуть на сервере до файла php с использованием PHP_URL_PATH
Когда вам нужно избавиться от всякого мусора в пути до файла на сервере, то можно использовать ниже идущий способ:
Если вы собирайтесь делать сайт, то вам все равно придется иметь на борту несколько путей и разных, в разных переменных!
Так не получится, что например вы написали одну переменную и этого вам хватит - точно вам говорю не хватит!
Вчера мы рассматривали путь до корневой папки .
Из которой вы узнали, что путь до корневой папки я помещал в переменную - $home
В переменную $parse_url поместим функцию parse_url и разберем на части $_SERVER['REQUEST_URI'] из которой получим только часть ссылки где есть путь:
При работе с файлом сайта на сервере может возникнуть необходимость в определении его полного пути. Для выполнения этой задачи существует несколько способов, о них и пойдет речь далее.
Адреса файлов на серверах
Второй распространенный вариант – использование протокола FTP, который может работать в обоих направлениях – как для загрузки файлов, так и для их скачивания. На следующем скриншоте вы видите пример того, как отображается по FTP открытая для пользователей папка сайта с возможностью скачать любой файл.
Соответственно, на этой же странице можно с легкостью получить информацию о полном пути файла.
Определение адреса файла на сервере
Разберу основные методы получения адресов файлов, хранящихся на сервере.
Консольная утилита pwd (для Linux)
Пользователи выделенного сервера или VDS с Linux могут задействовать простую консольную утилиту pwd, которая предназначена для отображения пути текущего каталога, где сейчас и выполняются все действия. Эту утилиту можно использовать и для определения адреса файла на сервере. Вывод абсолютного пути осуществляется путем ввода простой команды:
Она поддерживает дополнительные опции, позволяющие немного модернизировать результат вывода:
-L — отменяет разыменовывание символических ссылок, их отображение осуществляется без конвертирования в исходный путь.
-p — конвертирует символические ссылки в их исходные имена с отображением указываемых директорий.
Если вы задаетесь вопросом, можно ли использовать pwd в своих скриптах, то ответ на него будет « Да » . В этом нет ничего сложного, а простое представление объявления утилиты выглядит как DIR=`pwd` или DIR=$(pwd).
Панели управления и FTP
Конечно, есть и другие распространенные варианты представления данных путей, поэтому в случае надобности не стесняйтесь обращаться к технической поддержке хостинг-провайдера для получения соответствующей информации. Впрочем, далее остается только отыскать целевой файл в этой директории или ее подпапках, чтобы узнать путь, который и будет начинаться с адреса сайта.
Если вы арендуете виртуальный хостинг, то путь к файлу легко определить, если подключиться к серверу по FTP.
Откроем свойства файла любого файла в папке тестового сайта на Wordpress и увидим его полный FTP-адрес.
Создание PHP-скрипта
Есть небольшой скрипт, который нужно сохранить в отдельном файле. Он позволяет получить абсолютный путь любого файла, а реализовывается это благодаря тому, что вся информация уже хранится под одной переменной $_SERVER . Создайте пустой файл и вставьте туда следующий код:
Отредактируйте его под себя, после чего сохраните с любым названием и задайте тип файла .php . Используйте FTP-клиент для загрузки этого файла в корневую папку целевого сайта.
Последний этап – запуск этого скрипта. В адресной строке браузера введите адрес вашего сайта и в конце добавьте /file.php , где file замените на название файла со скриптом. На новой странице в веб-обозревателе отобразятся примерно следующие сведения:
Вы можете использовать один из этих методов, когда требуется определить абсолютный путь файла.
PHP это скриптовый язык, созданный изначально для быстрого ваяния домашних страничек (да, да изначально это же был Personal Home Page Tools), а в дальнейшем на нём уже стали создавать магазины, социалки и другие поделки на коленке которые выходят за рамки задуманного, но к чему это я – а к тому, что чем больше функционала закодировано, тем больше желание его правильно структурировать, избавиться от дублирования кода, разбить на логические кусочки и подключать лишь при необходимости (это тоже самое чувство, которое возникло у вас, когда вы читали это предложение, его можно было бы разбить на отдельные кусочки). Для этой цели в PHP есть несколько функции, общий смысл которых сводится к подключению и интерпретации указанного файла. Давайте рассмотрим на примере подключения файлов:
Если запустить скрипт index.php, то PHP всё это будет последовательно подключать и выполнять:
Когда файл подключается, то его код оказывается в той же области видимости, что и строка в которой его подключили, таким образом все переменные, доступные в данной строке будут доступны и в подключаемом файле. Если в подключаемом файле были объявлены классы или функции, то они попадают в глобальную область видимости (если конечно для них не был указан namespace).
Если вы подключаете файл внутри функции, то подключаемые файлы получают доступ к области видимости функции, таким образом следующий код тоже будет работать:
Отдельно отмечу магические константы: __DIR__ , __FILE__ , __LINE__ и прочие — они привязаны к контексту и выполняются до того, как происходит включение
Особенностью подключения файлов является тот момент, что при подключении файла парсинг переключается в режим HTML, по этой причине любой код внутри включаемого файла должен быть заключен в PHP теги:
Если у вас в файле только PHP код, то закрывающий тег принято опускать, дабы случайно не забыть какие-нить символы после закрывающего тега, что чревато проблемами (об этом я ещё расскажу в следующей статье).
А вы видели сайт-файл на 10 000 строк? Аж слёзы на глазах (╥_╥)…
Функции подключения файлов
Как уже было сказано выше, в PHP существует несколько функций для подключения файлов:
-
— включает и выполняет указанный файл, если не находит — выдаёт предупреждение E_WARNING — аналогично функции выше, но включает файл единожды — включает и выполняет указанный файл, если не находит — выдаёт фатальную ошибку E_ERROR — аналогично функции выше, но включает файл единожды
В действительности, это не совсем функции, это специальные языковые конструкции, и можно круглые скобочки не использовать. Кроме всего прочего есть и другие способы подключения и выполнения файлов, но это уже сами копайте, пусть это будет для вас «задание со звёздочкой» ;)
Давайте разберём на примерах различия между require и require_once , возьмём один файл echo.php:
И будем его подключать несколько раз:
Результатом выполнения будет два подключения файла echo.php:
Существует ещё парочка директив, которые влияют на подключение, но они вам не потребуются — auto_prepend_file и auto_append_file. Эти директивы позволяют установить файлы которые будут подключены до подключения всех файлов и после выполнения всех скриптов соответственно. Я даже не могу придумать «живой» сценарий, когда это может потребоваться.
Где ищет?
PHP ищет подключаемые файлы в директориях прописанных в директиве include_path. Эта директива также влияет на работу функций fopen() , file() , readfile() и file_get_contents() . Алгоритм работы достаточно простой — при поиске файлов PHP по очереди проверяет каждую директорию из include_path , пока не найдет подключаемый файл, если не найдёт — вернёт ошибку. Для изменения include_path из скрипта следует использовать функцию set_include_path().
При настройке include_path следует учитывать один важный момент — в качестве разделителя путей в Windows и Linux используются различные символы — ";" и ":" соответственно, так что при указании своей директории используйте константу PATH_SEPARATOR , например:
Когда вы прописываете include_path в ini файле, то можете использовать переменные окружения типа $ :
Если при подключении файла вы прописываете абсолютный путь (начинающийся с "/") или относительный (начинающийся с "." или ".."), то директива include_path будет проигнорирована, а поиск будет осуществлён только по указанному пути.
Возможно стоило бы рассказать и про safe_mode, но это уже давно история (с версии 5.4), и я надеюсь вы сталкиваться с ним не будете, но если вдруг, то чтобы знали, что такое было, но прошло.
Использование return
Расскажу о небольшом life-hack'е — если подключаемый файл возвращает что-либо с использованием конструкции return , то эти данные можно получить и использовать, таким образом можно легко организовать подключение файлов конфигурации, приведу пример для наглядности:
Занимательные факты, без которых жилось и так хорошо: если во включаемом файле определены функции, то они могут быть использованы в основном файле вне зависимости от того, были ли они объявлены до return или после
Написать код, который будет собирать конфигурацию из нескольких папок и файлов. Структура файлов следующая:
При этом код должен работать следующим образом:
- если в системном окружении есть переменная PROJECT_PHP_SERVER и она равна development , то должны быть подключены все файлы из папки default, данные занесены в перемененную $config , затем подключены файлы из папки development, а полученные данные должны перетереть соответствующие пункты сохраненные в $config
- аналогичное поведение если PROJECT_PHP_SERVER равна production (естественно только для папки production)
- если переменной нет, или она задана неверно, то подключаются только файлы из папки default
Автоматическое подключение
Конструкции с подключением файлов выглядят очень громоздко, так и ещё и следить за их обновлением — ещё тот подарочек, зацените кусочек кода из примера статьи про исключения:
Первой попыткой избежать подобного «счастья» было появление функции __autoload. Сказать точнее, это была даже не определенная функция, эту функцию вы должны были определить сами, и уже с её помощью нужно было подключать необходимые нам файлы по имени класса. Единственным правилом считалось, что для каждого класса должен быть создан отдельный файл по имени класса (т.е. myClass должен быть внутри файла myClass.php). Вот пример реализации такой функции __autoload() (взят из комментариев к официальному руководству):
Класс который будем подключать:
Файл, который подключает данный класс:
Теперь о проблемах с данной функцией — представьте ситуацию, что вы подключаете сторонний код, а там уже кто-то прописал функцию __autoload() для своего кода, и вуаля:
Чтобы такого не было, создали функцию, которая позволяет регистрировать произвольную функцию или метод в качестве загрузчика классов — spl_autoload_register. Т.е. мы можем создать несколько функций с произвольным именем для загрузки классов, и зарегистрировать их с помощью spl_autoload_register . Теперь index.php будет выглядеть следующим образом:
Рубрика «а вы знали?»: первый параметр spl_autoload_register() не является обязательным, и вызвав функцию без него, в качестве загрузчика будет использоваться функция spl_autoload, поиск будет осуществлён по папкам из include_path и файлам с расширением .php и .inc , но этот список можно расширить с помощью функции spl_autoload_extensionsТеперь каждый разработчик может регистрировать свой загрузчик, главное чтобы имена классов не совпадали, но это не должно стать проблемой, если вы используете пространства имён.
Поскольку уже давно существует такой продвинутый функционал как spl_autoload_register() , то функцию __autoload() уже заявлена как deprecated в PHP 7.1, а это значит, что в обозримом будущем данную функцию и вовсе уберут (Х_х)
- Каждая библиотека должна жить в собственном пространстве имён (т.н. vendor namespace)
- Для каждого пространства имён должна быть создана собственная папка
- Внутри пространства имён могут быть свои подпространства — тоже в отдельных папках
- Один класс — один файл
- Имя файла с расширением .php должно точно соответствовать имени класса
Полное имя класса | Пространство имён | Базовая директория | Полный путь |
---|---|---|---|
\Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
\Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
\Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
\Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
Различия этих двух стандартов, лишь в том, что PSR-0 поддерживает старый код без пространства имён (т.е. до версии 5.3.0), а PSR-4 избавлен от этого анахронизма, да ещё и позволяет избежать ненужной вложенности папок.
Благодаря этим стандартам, стало возможно появление такого инструмента как composer — универсального менеджера пакетов для PHP. Если кто пропустил, то есть хороший доклад от pronskiy про данный инструмент.
PHP-инъекция
Ещё хотел рассказать о первой ошибки всех, кто делает единую точку входа для сайта в одном index.php и называет это MVC-фреймворком:
Смотришь на код, и так и хочется чего-нить вредоносного туда передать:
Первое, что приходит на ум — принудительно добавлять расширение .php , но в ряде случаев это можно обойти «благодаря» уязвимости нулевого байта (почитайте, эту уязвимость уже давно исправили, но вдруг вам попадётся интерпретатор более древний, чем PHP 5.3, ну и для общего развития тоже рекомендую):
В современных версиях PHP наличие символа нулевого байта в пути подключаемого файла сразу приводит к соответствующей ошибке подключения, и даже если указанный файл существует и его можно подключить, то в результате всегда будет ошибка, проверяется это следующим образом strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename) (это из недров самого PHP)
Вторая «стоящая» мысль, это проверка на нахождение файла в текущей директории:
Третья, но не последняя модификация проверки, это использование директивы open_basedir, с её помощью можно указать директорию, где именно PHP будет искать файлы для подключения:
Будьте внимательны, данная директива влияет не только на подключение файлов, но и на всю работу с файловой системой, т.е. включая данное ограничение вы должны быть уверены, что ничего не забыли вне указанной директории, ни кешированные данные, ни какие-либо пользовательские файлы (хотя функции is_uploaded_file() и move_uploaded_file() продолжат работать с временной папкой для загруженных файлов).
Какие ещё возможны проверки? Уйма вариантов, всё зависит от архитектуры вашего приложения.
Хотел ещё вспомнить о существовании «чудесной» директивы allow_url_include (у неё зависимость от allow_url_fopen), она позволяет подключать и выполнять удаленный PHP файлы, что куда как опасней для вашего сервера:
Увидели, запомнили, и никогда не пользуйтесь, благо по умолчанию выключено. Данная возможность вам потребуется чуть реже, чем никогда, во всех остальных случаях закладывайте правильную архитектуру приложения, где различные части приложения общаются посредством API.
В заключение
Данная статья — основа-основ в PHP, так что изучайте внимательно, выполняйте задания и не филоньте, за вас никто учить не будет.
Проверить ссылки для скачивания
Ранее упоминалось, что файлы zip и exe загружаются автоматически, без использования сценария PHP. Сначала создайте HTML-файл со следующим кодом. Здесь четыре элемента привязки определены для загрузки файлов четырех типов. Эти типы файлов включают файлы TEXT, ZIP, PDF и JPG.
После нажатия ссылки на zip-файл появится следующее диалоговое окно для загрузки файла. Затем пользователь может загрузить файл или открыть файл в диспетчере архивов.
Загрузить файл с помощью функции readfile()
Функция readfile() используется в сценарии PHP для принудительной загрузки любого файла из текущего местоположения или файла с путем к файлу. Синтаксис этой функции приведен ниже.
Пример 1: Загрузить файл с именем файла
В этом примере мы создадим HTML-файл со следующим кодом, в котором имя файла будет передано в качестве параметра URL-адреса с именем path, а значение этого параметра будет передано в файл PHP с именем download.php.
Выходные данные появятся после щелчка по ссылке для загрузки файла изображения. Размер файла изображения rose.jpg составляет 27,2 КБ, как показано в диалоговом окне. Вы можете загрузить файл, установив переключатель «Сохранить файл» и нажав кнопку OK.
Пример 2: Загрузить файл с указанием пути к файлу
Если файл существует в указанном месте, путь к файлу необходимо указать в URL-адресе. В этом примере мы создадим HTML-файл со следующим кодом, который будет передавать имя файла с путем к файлу:
Мы создадим файл PHP со следующим кодом, чтобы загрузить файл по пути к файлу. Код PHP в предыдущем примере будет немного изменен для загрузки файла по заданному пути. Функция clearstatecache() используется для очистки кеша, который был ранее сохранен. В функции readfile() используются два аргумента.
Вывод
В этой статье представлен простой способ принудительной загрузки любого файла с помощью сценария PHP, чтобы помочь читателям добавить функцию загрузки в свой сценарий.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Эти PDF_DOC, WORD_DOC, EXCEL_DOC, DWG_DOC должны загружаться на сервер (в папку uploads) и нужно вывести ссылки на бд .
Благодарю за помощь!
Добавлено через 6 часов 40 минут
Неужели никто не знает.
Помощь в написании контрольных, курсовых и дипломных работ здесь
Проблемы с загрузкой файла на сервер.
Добрый день. Будьте добры, помогите, пожалуйста. Необходимо загрузить файл на сервер. Для этого.
Ошибка с загрузкой(копированием) файла на локальном сервер
Доброго времени суток, читатель. Пытался сделать загрузчик файла(изображения) с клиентской(ajax).
Очень странная ситуация с загрузкой файла на сервер!
такая ситуация, сделал форму загрузки файла: <form action="upload_file.php".
как в php разместить ссылку на скачивание файла, который был загружен на сервер?
есть страница с формой, через которую файл загружается на сервер, часть кода: <form.
Виталюска, может быть несколько..
Благодарю, за отклик..
Добавлено через 1 минуту
nrobert, спасибо, за код.
Но загрузки не происходит. Написано " НЕ УДАЛОСЬ ЗАГРУЖАТЬ".
Структура таблици-
TableName: accounts
id int11 AI
username varch32
avatar varch500
Ну а потом когда выводити ссылку из базы выводите её в таком формате - <img src="/upload/<?=$Res['avatar']?>">
Решение
SkoTi, воздерживайтесь от написания того, о чем смутно понимаете.nrobert, благодарю за ответ. Уже целый час разбираюсь.. Пока не получается..
Благодарю, ВАС, nrobert.
nrobert, все равно также.. Спасибо большое за помощь!
Добавлено через 1 минуту
Теперь еще Обновление не меняются файлы. Не подскажете как это сделать..
Добавлено через 1 минуту
Что значит
через форму можно обновить данные. Все меняются кроме загрузки файла.
nrobert, с 211 по 245 строки выполняется, а обновляет с 238 по 240. Так у вас же нет таких переменных, как $_POST['pdf_doc'], $_POST['word_doc'], $_POST['excel_doc'], $_POST['dwg_doc']. nrobert, почему я же их здесь $type_doc = mysql_escape_string( $_POST['type_doc'] ); разве не присваиваю.. или я не так поняла..
Решение
DDAri, данные из <input type="file"/> попадают в $_FILES, остальное - в $_POST.Решение
Не знаю, что вы записываете в БД, но если название файла, то $_FILES['pdf_doc']['name'] и т.д.nrobert, спасибо, Вам, за помощь!
Добавлено через 18 минут
nrobert, те же файлы, которые добавлялись до этого. если вдруг нужно обновить их для этого делаю обновление.
Посмотрите, пожалуйста, добавила $_FILES['pdf_doc']['name']
в таблице выводится, а в папку uploads не попало.. вот тот часть конечного кода
Проблемы с загрузкой файлов на сервер
Имеется простенький jsp для выбора файла и отправки данных о нём <%@page contentType="text/html".
Проблемы с загрузкой файлов на сервер.
Немогу загрузить файл на сервер. Помогите. Вот скрипт и ошибка: copy($_FILES,$loc); .
Проблема с загрузкой файлов на сервер
День добрый, в очередной раз с повпросом. Такой кусок кода: if($_FILES!='')< .
Помогите с загрузкой фото на сервер(с формы)
Помогите с загрузкой фото на сервер(с формы). Если можно, с комментарием Спасибо
Проблемы с загрузкой docx и doc файлов на сервер
Доброго времени суток, у меня есть php обработчик кнопки для загрузки файлов на сервер. Однако в.
Сканер отпечатков пальцев автономный с загрузкой на сервер
Помогите сделать такую вещь, Сканер отпечатков пальцев автономный с загрузкой сканов на сервер и.
Читайте также: