공개 경로를 얻는 방법


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 : //의 경우 분명히 거짓이기 때문입니다.
  • OP의 경우 분명히 거짓이므로 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

@ DrCord 그것은 당신에게주는 같은 것을 file_create_url()제공합니다.
kiamlaluno

1
아무 그것은 당신에게 같은 서버 경로를 제공하지 않습니다/var/www/webroot/etc/more_folders/
DrCord

38

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

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이 아닌 경로를 반환하는데, 이것이 질문에서 요구하는 것입니다. 내 생각에 이것은 받아 들인 대답보다 낫습니다.
Scott Joudry

api.drupal.org/api/drupal/includes!file.inc/function/… . 주석에서 볼 수 있듯이 drupal_realpath ()는 더 이상 사용되지 않습니다.
Wordzilla

1
@ Wordzilla, 그렇지 않습니다. 최신 Drupal 소스를 확인하면 대량의 장소에서 사용되는 것을 알 수 있습니다. 더 이상 사용되지 않지만 사용은 제한되어야합니다. file.inc의 문서 는 " 감지 되었지만"더 이상 사용되지 않는다고 말합니다.
Andrey Rudenko

@ScottJoudry OP는 URL이 아니라 public : // 경로를 요청합니다 .
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를 상대 경로로 변환하려면 어떻게해야합니까?


관련 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.