PHP를 사용하여 파일 업로드 기능을 구축 할 때는 일반적으로 업로드 대상 디렉토리가 존재하는지 확인해야합니다. is_dir () 는이 점검을 수행하는 일반적인 기능입니다. 그러나 많은 개발자들은 is_dir ()를 사용할 때 약간의 의심을 나타냅니다. 디렉토리는 명확하게 존재하지만 함수는 False를 반환합니다. 또는 업로드가 실패하여 디렉토리에 권한이 없음을 알려줍니다. 이 기사는 IS_DIR ()를 사용하여 업로드 된 디렉토리를 확인할 때 디렉토리 권한을 확인하는 방법을 여러 관점에서 분석합니다.
is_dir () 는 PHP가 제공하는 내장 함수이며, 주어진 파일 경로가 디렉토리인지 여부를 결정하는 데 사용됩니다. 기본 구문은 다음과 같습니다.
bool is_dir(string $filename)
반환 값은 부울 입니다. $ filename 이 존재하면 디렉토리 인 경우. 그렇지 않으면, 거짓 .
많은 초보자는 종종 상대 경로를 사용하여 다음과 같은 디렉토리를 확인합니다.
if (is_dir('uploads/')) {
// ...
}
이것은 경우에 따라 가능하지만 현재 스크립트 실행 경로에 취약합니다. 더 안전한 접근법은 __dir__ 또는 RealPath ()를 사용하여 절대 경로를 얻는 것입니다.
$uploadDir = __DIR__ . '/uploads/';
if (is_dir($uploadDir)) {
// 안전하고 신뢰할 수있는 디렉토리 검사
}
또는:
$uploadDir = realpath(__DIR__ . '/uploads/');
if ($uploadDir !== false && is_dir($uploadDir)) {
// 디렉토리가 존재합니다
}
경로가 부적절하게 접합되거나 불법 문자가 사용되거나 디렉토리 분리기 오류 (특히 Windows와 Linux 사이의 전환을 개발할 때)가 사용되는 경우 IS_DIR () 도 False를 반환합니다.
일부 시스템에서는 경로에 중국어 또는 특수 문자가 있으면 경로 해상도가 실패 할 수 있습니다. 폴더의 이름으로 영어 문자와 밑줄을 사용하는 것이 좋습니다.
IS_DIR ()은 디렉토리가 존재하는지 확인할 수 있으며 읽기 및 쓰기 권한이 있는지 확인할 수 없습니다. 파일을 업로드 할 때는 다음을 확인해야합니다.
디렉토리가 존재합니다 ( is_dir ()는 true를 반환합니다)
PHP 프로세스에는이 디렉토리에 대한 쓰기 권한이 있습니다 ( is_writable () )
$uploadDir = __DIR__ . '/uploads/';
if (!is_dir($uploadDir)) {
die('디렉토리가 존재하지 않습니다');
}
if (!is_writable($uploadDir)) {
die('디렉토리가 작성되지 않았습니다,권한 설정을 확인하십시오');
}
Linux 시스템에서는 다음 명령을 사용하여 권한을 수정할 수 있습니다.
chmod 755 uploads/
chown www-data:www-data uploads/
그중 www-data는 PHP 프로세스가 속한 사용자 (예 : Apache/Nginx의 PHP-FPM 사용자)가 서버 환경에 따라 다릅니다.
다른 실행 환경 (명령 줄, Apache, Nginx), __dir__ 및 현재 작업 경로는 다를 수 있습니다. 다음 코드를 사용하여 경로 문제를 디버깅하는 데 도움이 될 수 있습니다.
echo '현재 작업 디렉토리:' . getcwd() . PHP_EOL;
echo '현재 파일 경로:' . __FILE__ . PHP_EOL;
echo '디렉토리 절대 경로를 업로드하십시오:' . realpath(__DIR__ . '/uploads/') . PHP_EOL;
일부 개발자는 업로드 경로를 확인할 때 "URL"과 "파일 경로"의 차이를 혼동합니다. 예를 들어 다음 글쓰기 방법이 잘못되었습니다.
// 오류 예제:할 것이다 URL 길로 취급하십시오
$uploadDir = 'https://m66.net/uploads/';
if (is_dir($uploadDir)) {
// 영원히 돌아옵니다 false
}
is_dir ()는 URL에 사용할 수 없으며 서버의 로컬 파일 시스템으로의 경로에만 사용할 수 있습니다. CDN 또는 원격 저장소를 사용하는 경우 API 또는 기타 방법을 통해 원격 디렉토리를 확인해야합니다.
올바른 방법은 예를 들어 서버 로컬 경로를 사용하는 것입니다.
$uploadDir = $_SERVER['DOCUMENT_ROOT'] . '/uploads/';
이지도 /업로드/ URL에서 /var/www/html/uploads/ 와 같은 실제 파일 시스템의 경로에 대한 경로.
IS_DIR ()을 사용하여 업로드 디렉토리가 존재하는지 여부를 확인하는 것이 안전한 업로드 파일의 첫 번째 단계이지만 전체 프로세스의 견고성을 보장하기 위해 경로 해상도 및 권한 점검과 협력해야합니다. 다음 사항을 기억하십시오.
절대 경로를 사용하는 것이 상대 경로보다 낫습니다
is_dir () 및 is_writable ()가 동시에 만족하는 확인
is_dir () 로 파일 경로로 URL을 전달하지 마십시오.
__dir__ , realPath () 및 getCWD () 의 디버그 경로 문제를 도와주세요.
업로드 디렉토리에 서버 쓰기 권한이 있는지 확인하십시오
이는 경로 나 권한으로 인한 업로드 실패를 효과적으로 피하고 업로드 기능의 안정성을 향상시킬 수 있습니다.