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


43

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

回答:


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://の場合、これは明らかにfalseであるためです。
  • これは、OPの場合は明らかにfalseであるため、URIがプロトコル相対であることを確認しません。
  • public://は適切にフォーマットされたストリームであるため、URIが適切にフォーマットされたストリームではないことはチェックしません。
  • この場合はパブリックであるため、スキームが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 14

@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 14

3
OPはURLではなくパスを要求しました。
キアムルノ

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 14年

1
@Wordzilla、そうではありません。最新のDrupalソースを確認すると、大量の場所で使用されていることがわかります。非推奨ではありませんが、使用を制限する必要があります。file.incのドキュメントには、「非推奨」ではあるが、非推奨ではないと記載されています。
アンドレイルデンコ14年

@ScottJoudry OPはURLではなくpublic://のパスを要求します。
キアムルノ

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


関連する:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.