업로드 파일 경로 2중으로 하면 왜 안될까요?
본문
안녕하세요
펑션, 인자값
function it_file_upload($srcfile, $filename, $dir) {
if($filename == '') return '';
if(!is_dir($dir)) {
@mkdir($dir, G5_DIR_PERMISSION);
@chmod($dir, G5_DIR_PERMISSION);
}
$pattern = "/[#\&\+\-%@=\/\\:;,'\"\^`~\|\!\?\*\$#<>\(\)\[\]\{\}]/";
$filename = preg_replace("/\s+/", "", $filename);
$filename = preg_replace( $pattern, "", $filename);
$filename = preg_replace_callback("/[가-힣]+/", '_callback_it_img_upload', $filename);
$filename = preg_replace( $pattern, "", $filename);
upload_file($srcfile, $filename, $dir);
$file = str_replace(G5_DATA_PATH.'/item/', '', $dir.'/'.$filename);
return $file;
}
잘되는 Case
$it_file = it_file_upload($_FILES['it_file']['tmp_name'], $_FILES['it_file']['name'], $it_img_dir.'/'.$it_id);
해당 방식으로 업로드를 하게 되면 data폴더에 폴더도 잘 생성되고 데이터도 잘 쌓입니다.
하지만 위에 경로에다가 /download 폴더를 하나 더 만들어서 거기다가 저장하게 하고 싶은데
폴더를 2중으로 주면 안되는데 왜 그런걸까요...?
안되는 Case ( '/download' 폴더 추가 )
$it_file = it_file_upload($_FILES['it_file']['tmp_name'], $_FILES['it_file']['name'], $it_img_dir.'/'.$it_id.'/download');
답변 3
폴더가 없을 경우 먼저 생생해 주세요
이미 임시파일을 업로드해서 해당 임시파일이 더 이상 없습니다. 업로드 한 파일을 복사 하는 형식으로 바꾸셔야 합니다.
※ 업로드 경로를 2중으로 설정할 때 발생하는 문제는
중첩된 폴더를 생성하지 못하는 mkdir
함수의 한계와
임시 파일이 업로드 중 삭제되는 상황 때문입니다.
이를 해결하기 위해 mkdir
함수에 recursive
옵션을 추가하여
모든 하위 디렉터리를 자동으로 생성하도록 설정하고,
업로드 전에 file_exists
로 임시 파일의 유효성을 확인해야 합니다.
또한, 업로드 처리 시 upload_file
함수 대신 copy
를 사용하여
원본 파일을 복사하는 방식으로 구현할 수 있으며,
파일 이름은 정규화를 통해 안전하게 처리해야 합니다.
- 기존 코드 변경
if (!is_dir($dir)) {
@mkdir($dir, G5_DIR_PERMISSION, true);
@chmod($dir, G5_DIR_PERMISSION);
}
- 파일이 유효한지 확인
if (!file_exists($srcfile)) {
return '';
}
- 원본 파일을 복사한 뒤 새 경로에 저장
copy($srcfile, $dir.'/'.$filename);
♣ 최종 예시
function it_file_upload($srcfile, $filename, $dir) {
if ($filename == '') return '';
// 폴더가 존재하지 않으면 생성
if (!is_dir($dir)) {
@mkdir($dir, G5_DIR_PERMISSION, true); // recursive 생성
@chmod($dir, G5_DIR_PERMISSION);
}
// 파일명 정규화
$pattern = "/[#\&\+\-%@=\/\\:;,'\"\^`~\|\!\?\*\$#<>\(\)\[\]\{\}]/";
$filename = preg_replace("/\s+/", "", $filename);
$filename = preg_replace($pattern, "", $filename);
$filename = preg_replace_callback("/[가-힣]+/", '_callback_it_img_upload', $filename);
$filename = preg_replace($pattern, "", $filename);
// 임시 파일 확인 및 업로드
if (!file_exists($srcfile)) {
return ''; // 임시 파일이 존재하지 않으면 종료
}
// 파일 업로드 또는 복사
upload_file($srcfile, $filename, $dir);
// 또는
// copy($srcfile, $dir.'/'.$filename);
$file = str_replace(G5_DATA_PATH.'/item/', '', $dir.'/'.$filename);
return $file;
}