Respostas:
Você pode usar o seguinte código, para obter o caminho real do público: //.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$realpath = $wrapper->realpath();
// ...
}
Este código é a versão simplificada do código usado por file_create_url()
, com as seguintes diferenças:
$wrapper->getExternalUrl()
pois o OP está pedindo o caminho, não o URLSe o OP quisesse a URL para public: //, eu teria usado o código a seguir, que ainda é uma versão simplificada do código usado pela função Drupal, que precisa ser mais genérica.
if ($wrapper = file_stream_wrapper_get_instance_by_uri('public://')) {
$url = $wrapper->getExternalUrl();
}
file_create_url()
; você verá que o código executado, neste caso, é exatamente o que escrevi na minha resposta.
file_create_url()
você.
/var/www/webroot/etc/more_folders/
Você pode usar a função file_create_url .
$uri = 'public://';
$path= file_create_url($uri)
global $base_url
para removê-lo e tornar esse servidor independente. global $base_url; $path = file_create_url($file_object->uri); $path = preg_replace('#' . $base_url . '#', '', $path);
Certifique-se de usar o '#' no regex, caso contrário, a substituição falhará devido a um '/' não escapado no $ base_url.
Caso esteja usando apenas arquivos locais ( não remotos! ), Você também pode tentar drupal_realpath ()
$path = 'public://custom_map';
drupal_realpath($path);
Voltará:
D:\Work\OpenServer\domains\local.testsite.com\sites\default\files\custom_map
Veja os seguintes exemplos:
$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);
}
ou:
$wrapper = file_stream_wrapper_get_instance_by_uri($uri);
$path = $wrapper->getDirectoryPath() . "/" . file_uri_target($uri);
print $path;
Verifique a API para DrupalPublicStreamWrapper
.
O uso file_create_url()
não funciona em todos os casos (como as outras respostas sugerem), porque o URL retornado não precisa estar no mesmo servidor. E o uso $_SERVER['DOCUMENT_ROOT']
funciona apenas para determinadas configurações do servidor.
Se você não quiser usar wrappers de fluxo, tente a solução mais simples:
$path = variable_get('file_public_path', conf_path() . '/files') . '/' . file_uri_target($uri);
Caso contrário, se você precisar de algo que funcione de maneira mais geral, verifique a solução do @ 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.
}
Leia mais: Como converter uma interface de usuário de arquivo em caminho relativo?
Relacionado: