Answers:
您可以使用以下代码来获取public://的真实路径。
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
该代码是所使用的代码的简化版本file_create_url()
,具有以下区别:
$wrapper->getExternalUrl()
因为OP正在询问路径而不是URL,所以它不会调用如果OP希望使用public://的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);
确保在正则表达式中使用“#”,否则替换将由于$ 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']
仅适用于某些服务器配置。
如果您不想使用流包装器,则可以尝试使用更简单的解决方案:
$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转换为相对路径?
有关: