回答:
次のコードを使用して、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を相対パスに変換するにはどうすればよいですか?
関連する: