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
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);
}