업로드 파일 경로 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를 사용하여
원본 파일을 복사하는 방식으로 구현할 수 있으며,
파일 이름은 정규화를 통해 안전하게 처리해야 합니다.
- 기존 코드 변경
</p>
<p>if (!is_dir($dir)) {
@mkdir($dir, G5_DIR_PERMISSION, true);
@chmod($dir, G5_DIR_PERMISSION);
}</p>
<p>
- 파일이 유효한지 확인
</p>
<p>if (!file_exists($srcfile)) {
return '';
}</p>
<p>
- 원본 파일을 복사한 뒤 새 경로에 저장
</p>
<p>copy($srcfile, $dir.'/'.$filename);</p>
<p>
♣ 최종 예시
</p>
<p>function it_file_upload($srcfile, $filename, $dir) {
if ($filename == '') return '';</p>
<p> // 폴더가 존재하지 않으면 생성
if (!is_dir($dir)) {
@mkdir($dir, G5_DIR_PERMISSION, true); // recursive 생성
@chmod($dir, G5_DIR_PERMISSION);
}</p>
<p> // 파일명 정규화
$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);</p>
<p> // 임시 파일 확인 및 업로드
if (!file_exists($srcfile)) {
return ''; // 임시 파일이 존재하지 않으면 종료
}</p>
<p> // 파일 업로드 또는 복사
upload_file($srcfile, $filename, $dir);
// 또는
// copy($srcfile, $dir.'/'.$filename);</p>
<p> $file = str_replace(G5_DATA_PATH.'/item/', '', $dir.'/'.$filename);
return $file;
}</p>
<p>
답변에 대한 댓글 2개
댓글을 작성하려면 로그인이 필요합니다.
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인