2009-08-06 11 views
25

पर फ़ाइल सिस्टम पथ कनवर्ट करें मुझे अक्सर लगता है कि मेरे पास मेरी परियोजनाओं में फाइलें हैं जिन्हें फ़ाइल सिस्टम के साथ-साथ उपयोगकर्ता ब्राउज़र से एक्सेस करने की आवश्यकता है। एक उदाहरण फोटो अपलोड कर रहा है। मुझे फाइल सिस्टम पर फ़ाइलों तक पहुंच की आवश्यकता है ताकि मैं छवियों को बदलने या उन्हें चारों ओर स्थानांतरित करने के लिए जीडी का उपयोग कर सकूं। लेकिन मेरे उपयोगकर्ताओं को example.com/uploads/myphoto.jpg जैसे यूआरएल से फ़ाइलों तक पहुंचने में भी सक्षम होना चाहिए।PHP - यूआरएल

क्योंकि अपलोड पथ आमतौर पर यूआरएल के अनुरूप होता है, मैंने एक ऐसा फ़ंक्शन बनाया जो अधिकांश समय काम करता है। उदाहरण के लिए इन रास्तों लें:

फाइल सिस्टम /var/www/example.com/uploads/myphoto.jpg

यूआरएल http://example.com/uploads/myphoto.jpg

अगर मैं कुछ करने के लिए एक चर सेट था /var/www/example.com/ की तरह मैं इसे फाइल सिस्टम पथ से घटा सकता हूं और फिर इसे छवि के यूआरएल के रूप में उपयोग कर सकता हूं।

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

क्या किसी को इसे संभालने का बेहतर तरीका पता है?

+0

धन्यवाद। हालांकि यह त्रुटि प्रवण हो सकती है, यह वही है जो मुझे मेरे मामले में चाहिए। –

उत्तर

8

मान लें निर्देशिका /path/to/root/document_root/user/file है और पता site.com/user/file

पहले समारोह मैं वर्ल्ड वाइड वेब पता करने के लिए वर्तमान फ़ाइल के नाम रिश्तेदार मिल जाएगा दिखा रहा है।

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

और परिणाम होगा:

site.com/user/file 

दूसरा समारोह स्ट्रिप्स दस्तावेज़ जड़ से दिए गए पथ।

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

/user/file 
+2

इस बात पर विचार करते हुए कि '$ _SERVER ['PHP_SELF'] के अनुचित उपयोग हानिकारक हो सकते हैं। – sepehr

+0

हाँ मैंने सोचा कि मुश्किल तरीके से जब कुछ मूर्ख ने redditmirror.cc को हैक किया है; o damn config.php को ओवरराइट करें। –

+0

यह मजाकिया है कि लोग अभी भी $ _SERVER मानों पर भरोसा करते हैं। http://videos.code2design.com/video/play/PHP/11 – Xeoncross

6

IMHO ऐसे स्वचालन मिलेगा को देखते हुए मैं /path/to/root/document_root/user/file में पारित कर दिया है, मैं वास्तव में है प्रवण त्रुटि। आप कुछ स्पष्ट पथ सहायकों (जैसे अपलोड के लिए एक, उपयोगकर्ता चित्रों के लिए एक इत्यादि) का उपयोग करके बहुत बेहतर हैं या उदाहरण के लिए बस कक्षा के साथ एक अपलोड की गई फ़ाइल को समाहित करें।

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

मैं इस दृष्टिकोण को दूसरा करता हूं! –

6

(होस्ट पोर्ट सहित) अधिक सटीक तरीका यह

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

$ प्रोटोकॉल लौटाएं। $ _ सर्वर ['HTTP_HOST']। Str_replace ($ _ सर्वर ['DOCUMENT_ROOT'], '', realpath ($ file)); रीयलपैथ जोड़ना आउटपुट यूआरएल को सही तरीके से साफ करें - इनपुट में ../ या ./ पथ में wven। – ZTK

3

का उपयोग यह अपने आप पर आसान बनाने और बस दोनों फाइल सिस्टम और वेब फ़ोल्डर के लिए सही स्थानों को परिभाषित करने और छवि फ़ाइल नाम पहले जोड़ें करने के लिए किया जाएगा उनके साथ।

कहीं, आप घोषणा करते हैं:

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

तो फिर तुम सिर्फ अपनी जरूरत पर निर्भर करता है रास्तों के बीच स्वैप कर सकते हैं:

$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 
+0

हां, मैं वास्तव में मुख्य स्थानों के लिए स्थिरांक का उपयोग करता हूं - लेकिन मुझे डर है कि इससे मदद नहीं मिलेगी क्योंकि मुझे फ़ाइल के स्थान को तब तक नहीं पता जब तक कि मैं इसे प्राप्त नहीं करता।दूसरे शब्दों में, बेस यूपी अपलोड फ़ाइल या यूआरएल में सबसे अधिक - लेकिन वे उपफोल्डर या यहां तक ​​कि कहीं और भी हो सकते हैं। – Xeoncross

+0

आहा, एक से अधिक स्थानों के साथ काम करने के लिए जिम्मेदार नहीं था। – random

+0

मुझे लगता है कि यह सबसे अच्छा तरीका है .. अच्छी योजना जीवन को आसान बनाता है। – Popsyjunior

2

इस प्रयास करें:

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

$ _SERVER कुछ प्रकार के पार्सिंग के बिना उपयोग करने के लिए सुरक्षित नहीं है। – Xeoncross

1

उदाहरण के लिए, मैंने C:\WAMP\WWW\myfolder\document.txt से http://example.com/myfolder/document.txt को परिवर्तित करने के लिए इसका उपयोग किया:

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

यह सरल स्निपेट फ़ाइल पथ को सर्वर पर फ़ाइल के यूआरएल में परिवर्तित कर सकता है। प्रोटोकॉल और बंदरगाह जैसी कुछ सेटिंग्स को रखा जाना चाहिए।

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

मैं इस का इस्तेमाल किया और मेरे साथ काम किया है:

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

और अगर आप url स्वरूप में निर्देशिका नाम की आवश्यकता इस पंक्ति जोड़ें:

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

आपकी स्क्रिप्ट अन्य ऑपरेटिंग सिस्टम पर काम नहीं कर सकती है, इसलिए उपयोगकर्ता स्पष्ट रूप से इसके बजाय DIRECTORY_SEPARATOR स्थिर है। – Popsyjunior

0

नीचे कोड अच्छी तरह से है टिप्पणी की:

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'); 
0

मैं हमेशा हम अपने स्थानीय विकास के वातावरण में और @ जॉर्ज दृष्टिकोण ई सिमलिंक इस मामले में विफल रहता है:

DOCUMENT_ROOT/Library/WebServer/Documents पर सेट किया जाता है और एक सिमलिंक /Library/WebServer/Documents/repo1 -> /Users/me/dev/web/repo1

मान लें कि निम्नलिखित कोड /Users/me/dev/web/repo1/example.php

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

में हैं नहीं है जबकि

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

इस प्रकार, DOCUMENT_ROOT को 012 के साथ बदलनाकाम नहीं करता है।

मैं इस छोटे चाल के साथ आने:

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" 

मुझे लगता है कि यह अग्रदूत को रोकने के संभावित कीड़े अच्छा व्यवहार है भी हम उत्पादन वातावरण में सिमलिंक का उपयोग करने की संभावना नहीं है।

संबंधित मुद्दे