usar para paginas otro otra llamar listos incluir include_once funcion ejemplos desde codigos carpeta archivo php url filesystems

para - llamar funcion php desde otro php



PHP-Convertir ruta del sistema de archivos a URL (10)

El código a continuación está bien comentado:

function pathToURL($path) { //Replace backslashes to slashes if exists, because no URL use backslashes $path = str_replace("//", "/", realpath($path)); //if the $path does not contain the document root in it, then it is not reachable $pos = strpos($path, $_SERVER[''DOCUMENT_ROOT'']); if ($pos === false) return false; //just cut the DOCUMENT_ROOT part of the $path return substr($path, strlen($_SERVER[''DOCUMENT_ROOT''])); //Note: usually /images is the same with http://somedomain.com/images, // So let''s not bother adding domain name here. } echo pathToURL(''some/path/on/public/html'');

A menudo encuentro que tengo archivos en mis proyectos a los que se debe acceder desde el sistema de archivos y desde el navegador de los usuarios. Un ejemplo es subir fotos. Necesito acceso a los archivos en el sistema de archivos para poder usar GD para alterar las imágenes o moverlas. Pero mis usuarios también deben poder acceder a los archivos desde una URL como example.com/uploads/myphoto.jpg .

Debido a que la ruta de carga normalmente corresponde a la URL, creé una función que parece funcionar la mayor parte del tiempo. Tome estos caminos, por ejemplo:

Sistema de archivos /var/www/example.com/uploads/myphoto.jpg

URL http://example.com/uploads/myphoto.jpg

Si tuviera una variable configurada en /var/www/example.com/ , podría restarla de la ruta del sistema de archivos y luego usarla como la URL de la imagen.

/** * Remove a given file system path from the file/path string. * If the file/path does not contain the given path - return FALSE. * @param string $file * @param string $path * @return mixed */ function remove_path($file, $path = UPLOAD_PATH) { if(strpos($file, $path) !== FALSE) { return substr($file, strlen($path)); } } $file = /var/www/example.com/uploads/myphoto.jpg; print remove_path($file, /var/www/site.com/); //prints "uploads/myphoto.jpg"

¿Alguien sabe de una mejor manera de manejar esto?


En mi humilde opinión, dicha automatización es realmente propensa a errores. Es mucho mejor utilizar algunos ayudantes de ruta explícitos (por ejemplo, uno para las cargas, uno para las fotos de los usuarios, etc.) o simplemente encapsular, por ejemplo, un archivo cargado con una clase.

// Some "pseudo code" $file = UploadedFile::copy($_FILES[''foo'']); $file->getPath(); // /var/www/example.org/uploads/foo.ext $file->getUri(); // http://example.org/uploads/foo.ext


Este simple fragmento puede convertir la ruta del archivo a la URL del archivo en el servidor. Algunas configuraciones como protocolo y puerto deben mantenerse.

$filePath = str_replace(''//',''/'',$filePath); $ssl = (!empty($_SERVER[''HTTPS'']) && $_SERVER[''HTTPS''] == ''on'') ? true : false; $sp = strtolower($_SERVER[''SERVER_PROTOCOL'']); $protocol = substr($sp, 0, strpos($sp, ''/'')) . (($ssl) ? ''s'' : ''''); $port = $_SERVER[''SERVER_PORT'']; $stringPort = ((!$ssl && $port == ''80'') || ($ssl && $port == ''443'')) ? '''' : '':'' . $port; $host = isset($_SERVER[''HTTP_X_FORWARDED_HOST'']) ? $_SERVER[''HTTP_X_FORWARDED_HOST''] : isset($_SERVER[''HTTP_HOST'']) ? $_SERVER[''HTTP_HOST''] : $_SERVER[''SERVER_NAME'']; $fileUrl = str_replace($_SERVER[''DOCUMENT_ROOT''] ,$protocol . ''://'' . $host . $stringPort, $filePath);


Hágalo fácil para usted y simplemente defina las ubicaciones correctas tanto para el sistema de archivos como para las carpetas web y anteponga el nombre de archivo de la imagen con ellas.

En algún lugar, declararías:

define(''PATH_IMAGES_FS'', ''/var/www/example.com/uploads/''); define(''PATH_IMAGES_WEB'', ''uploads/'');

Luego puedes cambiar de ruta según tu necesidad:

$image_file = ''myphoto.jpg''; $file = PATH_IMAGES_FS.$image_file; //-- stores: /var/www/example.com/uploads/myphoto.jpg print PATH_IMAGES_WEB.$image_file; //-- prints: uploads/myphoto.jpg


Lo he usado y he trabajado conmigo:

$file_path=str_replace(''//',''/'',__file__); $file_path=str_replace($_SERVER[''DOCUMENT_ROOT''],'''',$file_path); $path=''http://''.$_SERVER[''HTTP_HOST''].''/''.$file_path;

Y si necesita el nombre del directorio en formato url, agregue esta línea:

define(''URL_DIR'',dirname($path));


Por ejemplo, utilicé este para convertir C:/WAMP/WWW/myfolder/document.txt a http://example.com/myfolder/document.txt use este:

$file_path=str_replace(''//',''/'',$file_path); $file_path=str_replace($_SERVER[''DOCUMENT_ROOT''],'''',$file_path); $file_path=''http://''.$_SERVER[''HTTP_HOST''].$file_path;


Prueba esto:

$imgUrl = str_replace($_SERVER[''DOCUMENT_ROOT''], '''', $imgPath)


Siempre uso enlaces simbólicos en mi entorno de desarrollo local y el enfoque de @George falla en este caso:

DOCUMENT_ROOT está establecido en /Library/WebServer/Documents y hay un enlace simbólico /Library/WebServer/Documents/repo1 -> /Users/me/dev/web/repo1

Supongamos que los siguientes códigos están en /Users/me/dev/web/repo1/example.php

$_SERVER[''DOCUMENT_ROOT''] == "/Library/WebServer/Documents" //default on OS X

mientras

realpath(''./some/relative.file'') == "/Users/me/dev/web/repo1/some/relative.file"

Por lo tanto, reemplazar DOCUMENT_ROOT con HTTP_HOST no funciona.

Se me ocurrió este pequeño truco:

function path2url($path) { $pos = strrpos(__FILE__, $_SERVER[''PHP_SELF'']); return substr(realpath($path), $pos); } // where __FILE__ == "/Users/me/dev/web/repo1/example.php" $_SERVER[''PHP_SELF''] == "/web/repo1/example.php" realpath("./some/relative.file") == "/Users/me/dev/web/repo1/some/relative.file" // If I cut off the pre-fix part from realpath($path), // the remainder will be full path relative to virtual host root path2url("./some/relative.file") == "/web/repo1/some/relative.file"

Creo que es una buena práctica prever los posibles errores, incluso si no es probable que usemos enlaces simbólicos en el entorno de producción.


Supongamos que el directorio es /path/to/root/document_root/user/file y la dirección es site.com/user/file

La primera función que estoy mostrando obtendrá el nombre del archivo actual relativo a la dirección de la World Wide Web.

$path = $_SERVER[''SERVER_NAME''] . $_SERVER[''PHP_SELF''];

y resultaría en:

site.com/user/file

La segunda función elimina la ruta de la raíz del documento.

$path = str_replace($_SERVER[''DOCUMENT_ROOT''], '''', $path)

Dado que pasé en /path/to/root/document_root/user/file , obtendría

/user/file


Una forma más precisa (incluido el puerto de host) sería usar esto

function path2url($file, $Protocol=''http://'') { return $Protocol.$_SERVER[''HTTP_HOST''].str_replace($_SERVER[''DOCUMENT_ROOT''], '''', $file); }