узнать абсолютный путь к файлу php
Есть файл в корне сайта, например /var/www/html/mysite/html/conf.php ,но полный путь к нему мне заранее не известен,известно только его название, как сделать include этого файла conf.php из файла, который выполняется в /html/img/conf/res.php
Отслеживать
2,995 21 21 серебряный знак 33 33 бронзовых знака
задан 31 окт 2017 в 9:05
diego_costa diego_costa
43 1 1 золотой знак 1 1 серебряный знак 7 7 бронзовых знаков
а это разве не «абсолютный путь» — /html/conf.php ? внесите, пожалуйста, ясность в текст вопроса, нажав править
31 окт 2017 в 9:15
это ведь был не абсольтный путь к файлу, а только от корня сайта, на сколько я понимаю
31 окт 2017 в 9:24
ну так припишите слева путь к корню сайта (т.н. document root).
31 окт 2017 в 9:29
document root показывает папку, которая по умолчанию в apache /var/www/html/, но что делать, если корень сайта в папке /var/www/html/mysite/html/
31 окт 2017 в 9:32
возникает подозрение, что вы пытаетесь решить какую-то неозвученную в вопросе проблему. начните лучше с начала, а не с конца.
31 окт 2017 в 9:32
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
echo $_SERVER['DOCUMENT_ROOT'];
Отслеживать
ответ дан 31 окт 2017 в 9:33
Smolin Pavel Smolin Pavel
1,167 6 6 серебряных знаков 8 8 бронзовых знаков
эта функция возвращает путь только до /var/www/html, а html/mysite/. не показывает
31 окт 2017 в 9:39
@diego_costa, пруф, там сказано «которая указана в конфигурационном файле сервера». Это замечательно, что Вы построили такое хитрое дерево директорий и вложили в него какой-то свой смысл. Но как программа-то об этом узнает?) мысли прочитает?
31 окт 2017 в 12:33
если б я заранее знал, что мне надо будет это делать) выходит, что нужно править файл конфиг сервера, чтобы получить доступ к корню через document_root?
realpath
realpath() раскрывает все символические ссылки, переходы типа /./ , /../ и лишние символы / в пути path , возвращая канонизированный абсолютный путь к файлу.
Список параметров
Замечание:
Несмотря на то, что путь должен быть указан, переданное значение может быть пустой строкой. В этих случаях значение интерпретируется как текущая рабочая директория.
Возвращаемые значения
В случае успешного выполнения возвращает канонизированный абсолютный путь. Результирующий путь не содержит символических ссылок и компонентов наподобие /./ или ‘ /../ . Разделители \ и / в конце пути также удаляются.
realpath() возвращает false при неудаче, например, если файл не существует.
Замечание:
Запускаемый скрипт должен иметь права запуска на всех директориях в проверяемой иерархии, иначе realpath() вернёт false .
Замечание:
Для регистронезависимых файловых систем, realpath() может нормализовать или не нормализовать регистр символов.
Замечание:
Функция realpath() не будет работать с файлом внутри архива Phar, так как путь может быть не реальным, а виртуальным.
Замечание:
В Windows переходы и символические ссылки на каталоги расширяются только на один уровень.
Замечание: Так как тип integer в PHP является целым числом со знаком, и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2 Гб.
Примеры
Пример #1 Пример использования функции realpath()
chdir ( ‘/var/www/’ );
echo realpath ( ‘./../../etc/passwd’ ) . PHP_EOL ;
?php
echo realpath ( ‘/tmp/’ ) . PHP_EOL ;
?>
Результат выполнения данного примера:
/etc/passwd /tmp
Пример #2 realpath() на Windows
На Windows realpath() изменит пути стиля Unix на стиль Windows.
echo realpath ( ‘/windows/system32’ ), PHP_EOL ;
?php
echo realpath ( ‘C:\Program Files\\’ ), PHP_EOL ;
?>
Результат выполнения данного примера:
C:\WINDOWS\System32 C:\Program Files
Смотрите также
- basename() — Возвращает последний компонент имени из указанного пути
- dirname() — Возвращает имя родительского каталога из указанного пути
- pathinfo() — Возвращает информацию о пути к файлу
User Contributed Notes 17 notes
15 years ago
Because realpath() does not work on files that do not
exist, I wrote a function that does.
It replaces (consecutive) occurences of / and \\ with
whatever is in DIRECTORY_SEPARATOR, and processes /. and /.. fine.
Paths returned by get_absolute_path() contain no
(back)slash at position 0 (beginning of the string) or
position -1 (ending)
function get_absolute_path ( $path ) $path = str_replace (array( ‘/’ , ‘\\’ ), DIRECTORY_SEPARATOR , $path );
$parts = array_filter ( explode ( DIRECTORY_SEPARATOR , $path ), ‘strlen’ );
$absolutes = array();
foreach ( $parts as $part ) if ( ‘.’ == $part ) continue;
if ( ‘..’ == $part ) array_pop ( $absolutes );
> else $absolutes [] = $part ;
>
>
return implode ( DIRECTORY_SEPARATOR , $absolutes );
>
?>
A test:
var_dump ( get_absolute_path ( ‘this/is/../a/./test/.///is’ ));
?>
Returns: string(14) «this/a/test/is»
As you can so, it also produces Yoda-speak. 🙂
10 years ago
Needed a method to normalize a virtual path that could handle .. references that go beyond the initial folder reference. So I created the following.
function normalizePath ( $path )
$parts = array(); // Array to build a new path from the good parts
$path = str_replace ( ‘\\’ , ‘/’ , $path ); // Replace backslashes with forwardslashes
$path = preg_replace ( ‘/\/+/’ , ‘/’ , $path ); // Combine multiple slashes into a single slash
$segments = explode ( ‘/’ , $path ); // Collect path segments
$test = » ; // Initialize testing variable
foreach( $segments as $segment )
if( $segment != ‘.’ )
$test = array_pop ( $parts );
if( is_null ( $test ))
$parts [] = $segment ;
else if( $segment == ‘..’ )
if( $test == ‘..’ )
$parts [] = $test ;
if( $test == ‘..’ || $test == » )
$parts [] = $segment ;
>
else
$parts [] = $test ;
$parts [] = $segment ;
>
>
>
return implode ( ‘/’ , $parts );
>
?>
Will convert /path/to/test/.././..//..///..///../one/two/../three/filename
to ../../one/three/filename
4 years ago
class Path
/**
* There is a method that deal with Sven Arduwie proposal https://www.php.net/manual/en/function.realpath.php#84012
* And runeimp at gmail dot com proposal https://www.php.net/manual/en/function.realpath.php#112367
* @param string $path
* @return string
*/
public static function getAbsolute ( string $path ): string
// Cleaning path regarding OS
$path = mb_ereg_replace ( ‘\\\\|/’ , DIRECTORY_SEPARATOR , $path , ‘msr’ );
// Check if path start with a separator (UNIX)
$startWithSeparator = $path [ 0 ] === DIRECTORY_SEPARATOR ;
// Check if start with drive letter
preg_match ( ‘/^[a-z]:/’ , $path , $matches );
$startWithLetterDir = isset( $matches [ 0 ]) ? $matches [ 0 ] : false ;
// Get and filter empty sub paths
$subPaths = array_filter ( explode ( DIRECTORY_SEPARATOR , $path ), ‘mb_strlen’ );
$absolutes = [];
foreach ( $subPaths as $subPath ) if ( ‘.’ === $subPath ) continue;
>
// if $startWithSeparator is false
// and $startWithLetterDir
// and (absolutes is empty or all previous values are ..)
// save absolute cause that’s a relative and we can’t deal with that and just forget that we want go up
if ( ‘..’ === $subPath
&& ! $startWithSeparator
&& ! $startWithLetterDir
&& empty( array_filter ( $absolutes , function ( $value ) < return !( '..' === $value ); >))
) $absolutes [] = $subPath ;
continue;
>
if ( ‘..’ === $subPath ) array_pop ( $absolutes );
continue;
>
$absolutes [] = $subPath ;
>
return
(( $startWithSeparator ? DIRECTORY_SEPARATOR : $startWithLetterDir ) ?
$startWithLetterDir . DIRECTORY_SEPARATOR : »
). implode ( DIRECTORY_SEPARATOR , $absolutes );
>
/**
* Examples
*
* echo Path::getAbsolute(‘/one/two/../two/./three/../../two’); => /one/two
* echo Path::getAbsolute(‘../one/two/../two/./three/../../two’); => ../one/two
* echo Path::getAbsolute(‘../.././../one/two/../two/./three/../../two’); => ../../../one/two
* echo Path::getAbsolute(‘../././../one/two/../two/./three/../../two’); => ../../one/two
* echo Path::getAbsolute(‘/../one/two/../two/./three/../../two’); => /one/two
* echo Path::getAbsolute(‘/../../one/two/../two/./three/../../two’); => /one/two
* echo Path::getAbsolute(‘c:\.\..\one\two\..\two\.\three\..\..\two’); => c:/one/two
*
*/
>
11 years ago
Note: If you use this to check if a file exists, it’s path will be cached, and returns true even if the file is removed (use file_exists instead).
16 years ago
Here’s a function to canonicalize a URL containing relative paths. Ran into the problem when pulling links from a remote page.
function canonicalize ( $address )
$address = explode ( ‘/’ , $address );
$keys = array_keys ( $address , ‘..’ );
foreach( $keys AS $keypos => $key )
array_splice ( $address , $key — ( $keypos * 2 + 1 ), 2 );
>
$address = implode ( ‘/’ , $address );
$address = str_replace ( ‘./’ , » , $address );
>
18 years ago
Sometimes you may need to refer to the absolute path of a file in your website instead of a relative path, but the realpath() function returns the path relative to the server’s filesystem, not a path relative to your website root directory.
For example, realpath() may return something like this:
You can’t use this in an HTML document, because the web server will not find the file. To do so, you can use:
function htmlpath ( $relative_path ) $realpath = realpath ( $relative_path );
$htmlpath = str_replace ( $_SERVER [ ‘DOCUMENT_ROOT’ ], » , $realpath );
return $htmlpath ;
>
echo ‘, htmlpath ( ‘../../relative/path/to/file.ext’ ), ‘» border=1>’ ;
?>
It will return something like:
4 years ago
realpath() is just a system/library call to actual realpath() function supported by OS. It does not work on a path as a string, but also resolves symlinks. The resulting path might significantly differs from the input even when absolute path is given. No function in this notes resolves that.
The suggestion on the realpath man page is to look for an existing parent directory. Here is an example:
function resolvePath ( $path ) if( DIRECTORY_SEPARATOR !== ‘/’ ) $path = str_replace ( DIRECTORY_SEPARATOR , ‘/’ , $path );
>
$search = explode ( ‘/’ , $path );
$search = array_filter ( $search , function( $part ) return $part !== ‘.’ ;
>);
$append = array();
$match = false ;
while( count ( $search ) > 0 ) $match = realpath ( implode ( ‘/’ , $search ));
if( $match !== false ) break;
>
array_unshift ( $append , array_pop ( $search ));
>;
if( $match === false ) $match = getcwd ();
>
if( count ( $append ) > 0 ) $match .= DIRECTORY_SEPARATOR . implode ( DIRECTORY_SEPARATOR , $append );
>
return $match ;
>
?>
The result will retrieve absolute path for non-existing relative path. Even if a path does not exists, there should be existing directory somewhere, for which the realpath could be obtained. If this is not within the relative path (i.e. even current working directory does not exists), getcwd() will retrieve absolute path, so some absolute path is returned (although in that case the PHP process could have huge problems).
13 years ago
Please be aware that this function does NOT always strip a trailing slash!:
LINUX (tested with PHP 5.2.11):
—
realpath(‘.’)
: string = «/myhttpdfolder»
realpath(‘./’)
: string = «/myhttpdfolder»
realpath(‘fileadmin’)
: string = «/myhttpdfolder/fileadmin»
realpath(‘fileadmin/’)
: string = «/myhttpdfolder/fileadmin»
WINDOWS (tested with PHP 5.2.5):
—
realpath(‘.’)
: string = «C:\\myhttpdfolder»
realpath(‘./’)
: string = «C:\\myhttpdfolder\\»
realpath(‘fileadmin’)
: string = «C:\\myhttpdfolder\\fileadmin»
realpath(‘fileadmin/’)
: string = «C:\\myhttpdfolder\\fileadmin\\»
Как получить путь к выбранному файлу php
Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
Здравствуйте уважаемые гуру! Такой, возможно «дурацкий» вопрос:
CODE (text):
скопировать код в буфер обмена
В $_POST[file] возвращаетЦо название файла, а путь к нему где взять??
Заранее спасибо за помощь
Отправлено: 26 Октября, 2007 — 19:25:26
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Помог: 3 раз(а)
Путь брать не надо. Он известен за ранее и равен
c:/windows/uploading/file.jpg
Вмеято file.jpg название файла возвращаемоеця в $_POST[‘file’]
А когда завтра утром вы после ночи долбаний бошкой по клавиатуре решите что с этим путём вам делать нечего
прочитайте http://phpclub[dot]ru/detail/article/upload
Отправлено: 26 Октября, 2007 — 19:47:04
Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
Наверное я не очень доходчио обьяснил суть проблемы!!
Попробую еще раз! Мне НЕ НУЖЕН аплоадинг. Мне просто нужно, что юзер с помощью диалога (вызываемого из ) выбрал на своём компе нужный файл, скажем картинку. после же того, как юзер нажимает submit я хочу получить не просто имя файла. а имя файла + путь, где этот файл лежит на компе юзера.
Ибо загружать файл я уже буду своими силами.
Отправлено: 26 Октября, 2007 — 22:02:37
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Помог: 3 раз(а)
— а нафиг путь?
+ ну хоть разделом не ошиблись ..
Отправлено: 29 Октября, 2007 — 14:51:29
Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
БУ ГО ГА!! Вы прикалываетесь?
Спасибо, конечно, за ответы. По сути: мне нужно передать пусть к файлу и его имя в переменную, которая потом попадет в скрипт. который, в свою очередь, будет заниматься сексом с выбранным файлом. теперь, надеюсь, понятна цель
Но, все равно, спасибо за ответы.
Отправлено: 29 Октября, 2007 — 15:31:02
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Помог: 3 раз(а)
О боже .
Если в вашей книге по пхп — первая глава не эта:
http://phpfaq[dot]ru/na_tanke#start
То отправляйтесь в магазин за мясом.
Чем разводить костёр на шашлыки — уже есть.
Отправлено: 29 Октября, 2007 — 15:42:33
Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
гы гы гы! ндаааа.
Еще раз для тех хто (пользуясь Вашей терминологией) в танке
1. Скрипт №1 дает возможность пользователю выбрать файл, помещаем результат выбора в переменную, скажем, ФайлНэйм
2. Скрипт №1 загружает Скрипт №2 вручая ему переменную ФайлНэйм
3. Скрипт №2 чёта делает с переменной ФайлНэйм
П.С. устал я от Вас, Валенок думал я чайник, гы гы гы
Отправлено: 29 Октября, 2007 — 15:45:38
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel
Помог: 3 раз(а)
ладно, читаем это и это, а потом можете заниматься сексом с файлами ..
Отправлено: 29 Октября, 2007 — 15:46:29
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006
Откуда: Москва
Помог: 10 раз(а)
Получить путь к файлу на компе пользователя можно. НО ЗАЧЕМ.
Отправлено: 29 Октября, 2007 — 15:48:43
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007
Откуда: Berlin
Помог: 707 раз(а)
А можно затылок чесать через задницу ((* ..
я думаю, что эта «необходимость» возникла из-за неправильного подхода к решению задачи.
+ как быть, если javascript запрещен или не поддерживается .. наверное, нарисовать на стенке место для удара головой.
——
Есть в мире две бесконечные вещи — это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Отправлено: 29 Октября, 2007 — 15:51:13
Покинул форум
Сообщений всего: 27
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
evgenijj, я хочу загрузить этот файл в базу-данных
Отправлено: 29 Октября, 2007 — 15:57:25
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006
Откуда: Москва
Помог: 10 раз(а)
ХОТТАБЫЧ пишет:
evgenijj, я хочу загрузить этот файл в базу-данных
Тебе надо прочитать те ссылки, что тебе уже приводили.
Цитата:
Как же PHP обрабатывает multipart-формы? Получив файл, он сохраняет его во временном каталоге upload_tmp_dir, имя файла выбирается случайным образом. Затем он создает четыре переменных суперглобального массива $_FILES. Этот массив содержит информацию о загруженном файле.
Цитата:
После завершения работы скрипта, временный файл будет удален. Это означает, что мы должны его скопировать в другое место до завершения работы скрипта. То есть алгоритм работы сценария загрузки файла на сервер такой:
Если кнопка «Submit» нажата, то файл уже будет загружен на сервер и его имя будут в переменной $_FILES[‘uploadfile’][‘name’]. В этом случае скрипт должен сразу скопировать файл с именем $_FILES[‘uploadfile’][‘tmp_name’] в какой-нибудь каталог (необходимы права на запись в этот каталог).
Как узнать полный путь к выбранному файлу из <input type="file" />
Мне необходимо сразу после выбора картинки отобразить её миниатюру (еще до загрузки).
Думал сделать нечто банальное:
Но браузеры либо ничего не подставляют, либо «C:\fakepath\имя_файла» либо вообще только имя_файла. Погуглив выяснил что это все из-за политики безопасности браузеров.
Посоветуйте какой-нибудь клиентский способ решения проблемы. В голову приходит только отправка файла ajax’ом обработчику для уменьшения и отдачи скрипту. Но хотелось бы не кушать трафик пользователей да и сервер нагружать лишний раз.
Может быть есть какой-нибудь другой способ решения проблемы? Может-быть с помощью клиентского Java?
Заранее спасибо!
UPD: вычитал что у Firefox и Chrome есть input.files[0].getAsDataURL(); Для других браузеров ничего похожего не найти? 🙂
UPD2: Пробовали с другом java-апплет сваять, оказывается их тоже ограничили в отличии от dexktop и server… Вроде бы только через хитрый нативный код на Си можно нарушить запреты 🙂 Ито для этого дела нужно писать еще и библиотеки под разные платформы + подписать и сделать доверительными…
- Вопрос задан более трёх лет назад
- 26807 просмотров
