ฉันต้องการเส้นทางสำหรับสาธารณะ: // ที่รันไทม์ มีฟังก์ชั่นที่ฉันสามารถใช้เพื่อรับมันได้หรือไม่?
ฉันต้องการเส้นทางสำหรับสาธารณะ: // ที่รันไทม์ มีฟังก์ชั่นที่ฉันสามารถใช้เพื่อรับมันได้หรือไม่?
คำตอบ:
คุณสามารถใช้รหัสต่อไปนี้เพื่อรับเส้นทางที่แท้จริงของสาธารณะ: //
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
รหัสนี้เป็นเวอร์ชั่นที่เรียบง่ายของรหัสที่ใช้โดยfile_create_url()
มีความแตกต่างดังต่อไปนี้:
$wrapper->getExternalUrl()
เนื่องจาก OP กำลังขอเส้นทางไม่ใช่สำหรับ URLหาก OP ต้องการ URL สำหรับสาธารณะ: // ฉันจะใช้รหัสต่อไปนี้ซึ่งยังคงเป็นเวอร์ชันที่เรียบง่ายของรหัสที่ใช้โดยฟังก์ชัน Drupal ซึ่งจำเป็นต้องมีทั่วไปมากกว่า
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; คุณจะเห็นรหัสที่ถูกเรียกใช้ในกรณีนี้คือสิ่งที่ฉันเขียนไว้ในคำตอบของฉัน
file_create_url()
คุณ
/var/www/webroot/etc/more_folders/
คุณสามารถใช้ฟังก์ชันfile_create_url
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
การลบและทำให้เซิร์ฟเวอร์นี้ไม่เชื่อเรื่องพระเจ้า global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
ตรวจสอบให้แน่ใจว่าใช้ '#' ใน regex มิฉะนั้นการแทนที่จะล้มเหลวเนื่องจาก un-escaped '/' ใน $ base_url
ในกรณีที่คุณใช้เฉพาะไฟล์ในตัวเครื่อง ( ไม่ใช่รีโมท! ) คุณสามารถลองใช้drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
มันจะกลับมา:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
ดูตัวอย่างต่อไปนี้:
$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;
ตรวจสอบ API DrupalPublicStreamWrapper
สำหรับ
การใช้file_create_url()
ไม่สามารถใช้ได้ในทุกกรณี (ตามคำแนะนำอื่น ๆ ) เนื่องจาก URL ที่ส่งคืนไม่จำเป็นต้องอยู่บนเซิร์ฟเวอร์เดียวกัน และใช้$_SERVER['DOCUMENT_ROOT']
งานได้เฉพาะสำหรับการกำหนดค่าเซิร์ฟเวอร์บางอย่าง
หากคุณไม่ต้องการใช้ stream wrappers คุณอาจลองวิธีแก้ปัญหาที่ง่ายกว่า:
$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 เป็นเส้นทางสัมพัทธ์ได้อย่างไร
ที่เกี่ยวข้อง: