web-dev-qa-db-ja.com

public://のパスを取得する方法

実行時にpublic://のパスを取得する必要があります。それを取得するために使用できる関数はありますか?

45
vintorg

次のコードを使用して、public://の実際のパスを取得できます。

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

このコードは、file_create_url()で使用されるコードの簡略版ですが、次の点が異なります。

  • OPがpublic://に関連付けられたパスを要求しているため、サードパーティのモジュールがURLを変更することはできません。
  • これは明らかにtrueであるため、URIに://が含まれていることは確認しません。
  • URIがルート相対URIであることを確認しません。これはpublic://の場合は明らかにfalseであるためです。
  • これは、OPの場合は明らかにfalseであるため、URIがプロトコル相対であることを確認しません。
  • Public://は適切にフォーマットされたストリームであるため、URIが適切にフォーマットされていないことは確認しません。
  • この場合はパブリックなので、スキームがhttpとhttpsのどちらであるかはチェックしません。
  • OPがURLではなくパスを要求しているため、$wrapper->getExternalUrl()は呼び出されません。

OPでpublic://のURLが必要な場合は、次のコードを使用します。これは、Drupal関数で使用されるコードの簡易バージョンであり、より一般的なものにする必要があります。

_if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
  $url = $wrapper->getExternalUrl();
}
_
35
kiamlaluno

file_create_url 関数を使用できます。

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

ローカルファイルのみを使用している場合(リモートではありません!drupal_realpath() を試すこともできます

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

戻ります:

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

次の例を参照してください。

_$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 を確認します。

返されるURLが同じサーバー上にある必要がないため、(他の回答が示唆するように)file_create_url()を使用しても、すべてのケースで機能するわけではありません。また、_$_SERVER['DOCUMENT_ROOT']_の使用は、特定のサーバー構成でのみ機能します。

ストリームラッパーを使用したくない場合は、より簡単な解決策を試すことができます。

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

それ以外の場合、より一般的に機能するものが必要な場合は、 @ hannanxp's ソリューションを確認してください:

_$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を相対パスに変換するにはどうすればよいですか?


関連:

3
kenorb