Существует ли PHP-функция, которая выполняет противоположное real_path?

#php

#php

Вопрос:

В скрипте загрузки у меня есть

 $destination = $_SERVER['DOCUMENT_ROOT'] . '/uploads/'. $_SESSION['username'] . '/entries/' . '/' . $year . '/';
  

и я загружаю путь к изображению в базу данных, и, таким образом, в строковых хранилищах хранится real_path (т. Е.. S:siteswwwmysiteuploadsusernameentries2011file.png )

существует ли функция, которая преобразует этот реальный путь в «http://sitename/uploads …»

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

Комментарии:

1. Как это будет работать? Дюжина URL-адресов может (и часто будет) отображаться в один и тот же физический файл. Какую из них вернет эта функция и какую магию предсказания она должна использовать?

Ответ №1:

Даже если бы она была, ее не следует считать надежной, поскольку компоненты в URL не обязательно сопоставляются с путями в файловой системе. Лучше всего удалить известный префикс из пути и заменить его базовым URL, содержащим МЕДИА.

Ответ №2:

Я нашел это на php.net :

 <?php
function mapURL($relPath) { //This function is not perfect, but you can use it to convert a relative path to a URL. Please email me if you can make any improvements.

    $filePathName = realpath($relPath);
    $filePath = realpath(dirname($relPath));
    $basePath = realpath($_SERVER['DOCUMENT_ROOT']);

    // can not create URL for directory lower than DOCUMENT_ROOT
    if (strlen($basePath) > strlen($filePath)) {
        return '';
    }

    return 'http://' . $_SERVER['HTTP_HOST'] . substr($filePathName, strlen($basePath));
}
?>
  

Ответ №3:

Похоже, все, что вам нужно сделать, это построить свой path по-другому.

 $base = '/uploads/'. $_SESSION['username'] . '/entries/' . '/' . $year . '/';
$destination = $_SERVER['DOCUMENT_ROOT'] . $base;
$url = $_SERVER['HTTP_HOST'] . $base;
  

Ответ №4:

Уверен, что есть. Это называется «замена пути». А именно:

 $file = 'S:\sites\www\mysite\uploads\username\entries\2011\file.png';

$root = 'S:\sites\www\mysite\';

$web  = str_replace( array($root,'\'), array('/','/'), $file);

$web => '/uploads/username/entries/2011/file.png'
  

Вы можете добавить туда свое доменное имя с помощью $_SERVER['SERVER_NAME'] .

С другой стороны, вы должны знать, что (sym) ссылки — это много к одному. То есть у вас может быть несколько ярлыков, указывающих на один и тот же файл, но не наоборот. Таким образом, вы не можете знать, какой ярлык является правильным.

Ответ №5:

«Самый надежный» (использовать с осторожностью) — использовать DIRECTORY_SEPARATOR :

 $uri = str_replace( DIRECTORY_SEPARATOR, "/", ltrim( $path, $root ) )