我如何获得公开://的路径


43

我需要在运行时获取public://的路径。我有可以使用的功能吗?

Answers:


34

您可以使用以下代码来获取public://的真实路径。

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

该代码是所使用的代码的简化版本file_create_url(),具有以下区别:

  • 由于OP要求与public://关联的路径,因此它不允许第三方模块更改URL。
  • 它不检查URI是否包含://,因为这显然是正确的
  • 它不会检查URI是否是相对于根的URI,因为对于public://来说显然是错误的
  • 它不会检查URI是否与协议相关,因为在OP的情况下这显然是错误的
  • 它不会检查URI的格式是否正确,因为public://是正确的格式
  • 它不会检查方案是http还是https,因为在这种情况下是公开的
  • $wrapper->getExternalUrl()因为OP正在询问路径而不是URL,所以它不会调用

如果OP希望使用public://的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 2014年

@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 2014年

3
OP要求输入路径,而不是URL。
kiamlaluno

20

如果只使用本地文件(不是远程文件),您也可以尝试drupal_realpath()

$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()。
Wordzilla 2014年

1
@Wordzilla,不是。如果您要检查最新的Drupal来源,则会发现它在很多地方都在使用,它不被弃用,但必须加以限制。file.inc中的文档说它“被禁止使用”,但不建议弃用。
2014年

@ScottJoudry OP请求public://的路径,而不是URL。
kiamlaluno

@Wordzilla:文档没有说它已被弃用;他们表示不建议这样做,因为它仅处理本地文件路径(公共文件系统将使用该路径)。从文档中:“仅当您知道URI中的流包装器使用本地文件系统,并且需要将绝对路径传递给与流URI不兼容的函数时,才使用此函数。”
GuyPaddock

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;

检查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转换为相对路径?


有关:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.