PHP - URL dönüştürme Dosya sistemi yolu

7 Cevap php

Ben genellikle dosya sisteminin yanı sıra kullanıcıların tarayıcıdan erişilebilir olması gerekir, benim projelerde dosyaları bulabilirsiniz. Bir örnek fotoğraf yüklerken. Ben görüntüleri değiştirmek ya da hareket etmek GD kullanabilirsiniz böylece ben dosya sistemindeki dosyalara erişimi gerekir. Ama kullanıcılar, aynı zamanda example.com/uploads/myphoto.jpg gibi bir URL'den dosyalara erişmek gerekiyor.

Yükleme yolunu genellikle ben çoğu zaman iş gibi görünüyor işlevini yapılan URL'ye karşılık çünkü. Örneğin bu yolları atın:

File System /var/www/example.com/uploads/myphoto.jpg

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

I /var/www/example.com/ sonra dosya yolu onu çıkarma ve ardından görüntüye URL olarak kullanabilirsiniz gibi bir şey için bir değişken seti olsaydı.

/**
 * 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"

Herkes bu işlemek için daha iyi bir yol biliyor mu?

7 Cevap

IMHO tür otomasyon gerçekten hata eğilimli. Bazı açık yolu yardımcıları (yüklemeler için örneğin bir kullanıcı resimlerim için bir, vb) kullanılarak ya da sadece, örneğin bir sınıf ile yüklenen bir dosyayı saklanması çok daha iyi uzakta.

// 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

Dizini varsayalım olan /path/to/root/document_root/user/file ve adresidir site.com/user/file

Ben gösteriyorum ilk fonksiyon World Wide Web Adresi Geçerli dosyanın ismi göreli alacak.

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

ve neden olur:

site.com/user/file

İkinci işlevi, belge kök verilen yolunu şeritler.

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

I /path/to/root/document_root/user/file, ben alacağı geçirilen verilen

/user/file

(Host port dahil) daha doğru bir şekilde kullanmak olacaktır

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

Kendiniz için kolay yapmak ve sadece dosya sistemi ve web klasörleri hem doğru konumları tanımlamak ve onlarla resim dosya yerleştiririz.

Bir yerde, beyan ediyorum:

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

Sonra sadece ihtiyaca göre yolları arasında geçiş yapabilirsiniz:

$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

Bu deneyin:

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

Örneğin, i C:\WAMP\WWW\myfolder\document.txt bu bir http://example.com/myfolder/document.txt kullanmak için dönüştürmek için bunu kullandı:

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

Bu basit pasajı sunucudaki dosyanın url dosya yolunu dönüştürebilirsiniz. Protokol ve port gibi bazı ayarlar tutulmalıdır.

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