मुझे जनता के लिए रास्ता कैसे मिलेगा: //


43

मुझे जनता के लिए पथ प्राप्त करने की आवश्यकता है: // रनटाइम पर। क्या कोई फंक्शन है जिसे मैं इसे प्राप्त करने के लिए उपयोग कर सकता हूं?

जवाबों:


34

आप निम्न कोड का उपयोग कर सकते हैं, जनता का वास्तविक मार्ग प्राप्त करने के लिए: //।

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $realpath = $wrapper->realpath();
  // ...
}

यह कोड file_create_url()निम्नलिखित अंतरों के साथ उपयोग किए गए कोड का सरलीकृत संस्करण है :

  • यह तृतीय-पक्ष मॉड्यूल को URL को बदलने की अनुमति नहीं देता है, क्योंकि ओपी जनता से जुड़े रास्ते के लिए पूछ रहा है: //
  • यह URI को शामिल नहीं करता है: //, क्योंकि यह स्पष्ट रूप से सच है
  • यह जाँच नहीं करता है कि URI जड़-सापेक्ष URI है, क्योंकि यह सार्वजनिक रूप से स्पष्ट रूप से गलत है: //
  • यह जाँच नहीं करता है कि URI प्रोटोकॉल सापेक्ष है, क्योंकि यह OP के मामले में स्पष्ट रूप से गलत है
  • यह जाँच नहीं करता है कि सार्वजनिक रूप से URI एक उचित स्वरूपित स्ट्रीम नहीं है, क्योंकि: // एक ठीक से स्वरूपित स्ट्रीम है
  • यह जाँच नहीं करता है कि यह योजना http या https है, क्योंकि यह मामला सार्वजनिक है
  • यह कॉल नहीं करता है $wrapper->getExternalUrl()क्योंकि ओपी पथ के लिए पूछ रहा है, URL के लिए नहीं

यदि ओपी जनता के लिए URL चाहता था: //, मैंने निम्नलिखित कोड का उपयोग किया होगा, जो अभी भी Drupal फ़ंक्शन द्वारा उपयोग किए जाने वाले कोड का सरलीकृत संस्करण है, जिसे अधिक सामान्य होने की आवश्यकता है।

if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $url = $wrapper->getExternalUrl();
}

3
@ junedkazi का बेहतर जवाब है।
AlessMascherpa

1
द्वारा प्रयुक्त कोड पढ़ें file_create_url(); आप निष्पादित कोड देखेंगे, इस मामले में, ठीक वही है जो मैंने अपने उत्तर में लिखा था।
kiamlaluno

1
यह आपको पूर्ण सर्वर पथ मिलेगा, url नहीं।
DrCord

@ डॉर्ड यह आपको वही चीज file_create_url()देता है जो आपको देता है।
kiamlaluno

1
नहीं, ऐसा नहीं है, यह आपको एक सर्वर पथ देता है जैसे/var/www/webroot/etc/more_folders/
DrCord

39

आप file_create_url फ़ंक्शन का उपयोग कर सकते हैं ।

$uri = 'public://';
$path= file_create_url($uri)

यह आपको url प्राप्त करता है, लेकिन सर्वर सहित। मैंने global $base_urlइसे हटाने और इस सर्वर को अज्ञेय बनाने के लिए एक साधारण रेगेक्स और उपयोग किया । global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);रेगेक्स में '#' का उपयोग करना सुनिश्चित करें, अन्यथा $ base_url में अन-एस्केप किए गए '/' के कारण प्रतिस्थापित विफल हो जाएगा।
DrCord

3
ओपी ने रास्ता पूछा, URL नहीं।
kiamlaluno

20

यदि आप केवल स्थानीय फ़ाइलों का उपयोग कर रहे हैं ( दूरस्थ नहीं! ) तो आप ड्रुपल_रेलपैथ () भी आज़मा सकते हैं।

$path = 'public://custom_map';
drupal_realpath($path);

यह वापस आ जाएगी:

D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map

4
यह एक पथ देता है और एक URL नहीं है, जो कि प्रश्न पूछता है। मेरी राय में यह स्वीकृत उत्तर से बेहतर है।
स्कॉट जौड्री

api.drupal.org/api/drupal/includes ! file.inc/function/… । drupal_realpath () टिप्पणियों के रूप में दर्शाया गया है।
वर्डजिला

1
@ कोर्डज़िला, खैर यह नहीं है। यदि आप नवीनतम Drupal स्रोत की जाँच करेंगे, तो आप पाएंगे कि यह बड़ी मात्रा में उपयोग में है, यह पदावनत नहीं है, लेकिन इसका उपयोग प्रतिबंधित होना चाहिए। File.inc में प्रलेखन कहता है कि यह "हतोत्साहित" है, लेकिन पदावनत नहीं किया गया है।
एंड्रे रुडेंको

@ScottJoudry ओपी जनता के लिए रास्ता पूछता है : // , URL नहीं।
kiamlaluno

@Ordzilla: डॉक्स यह नहीं कहते कि यह पदावनत है; उन्होंने कहा कि यह हतोत्साहित है क्योंकि यह केवल स्थानीय फ़ाइल पथों को संभालता है (जो कि सार्वजनिक फाइल सिस्टम होगा)। डॉक्स से: "केवल इस फ़ंक्शन का उपयोग करें यदि आप जानते हैं कि URI में स्ट्रीम रैपर स्थानीय फ़ाइल सिस्टम का उपयोग करता है, और आपको फ़ंक्शन के लिए एक पूर्ण पथ पास करने की आवश्यकता है जो स्ट्रीम यूआरआई के साथ असंगत है।"
ग्यूपैडपॉक

3

निम्नलिखित उदाहरण देखें:

$scheme = file_uri_scheme($file);

if ($scheme && file_stream_wrapper_valid_scheme($scheme)) {
  $wrapper = file_stream_wrapper_get_instance_by_scheme($scheme);
  $path = $wrapper->getLocalPath($file);
}

या:

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;

के लिए एपीआई की जाँच करें DrupalPublicStreamWrapper

उपयोग करना file_create_url()सभी मामलों में काम नहीं करता है (जैसा कि अन्य उत्तर बताते हैं), क्योंकि लौटाया गया URL एक ही सर्वर पर नहीं होना चाहिए। और $_SERVER['DOCUMENT_ROOT']केवल कुछ सर्वर कॉन्फ़िगरेशन के लिए काम करता है।

यदि आप स्ट्रीम रैपर का उपयोग नहीं करना चाहते हैं, तो आप सरल समाधान आजमा सकते हैं:

$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);

अन्यथा अगर आपको ऐसी चीज़ की ज़रूरत है जो आम तौर पर काम करती है, तो @ hannanxp का समाधान देखें:

$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
if ($wrapper instanceof DrupalLocalStreamWrapper) {
  $path = $wrapper->getDirectoryPath() . '/' . file_uri_target($uri);
}
else {
  // This does not appear to be a local file so there's no such thing as
  // a relative path; do appropriate error handling here.
}

और पढ़ें: मैं एक फ़ाइल uri को सापेक्ष पथ में कैसे बदल सकता हूं?


सम्बंधित:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.