업로드 파일 경로 2중으로 하면 왜 안될까요?

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
업로드 파일 경로 2중으로 하면 왜 안될까요?

QA

업로드 파일 경로 2중으로 하면 왜 안될까요?

답변 3

본문

안녕하세요

 

펑션, 인자값

function it_file_upload($srcfile, $filename, $dir) {

    if($filename == '') return '';

    if(!is_dir($dir)) {

        ($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)) {
    ($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)) {
        ($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;
}

폴더가 없을 경우 먼저 생생해 주세요

혹시 그 기능이 위 function안에 있는
  if(!is_dir($dir)) {

        ($dir, G5_DIR_PERMISSION);

        @chmod($dir, G5_DIR_PERMISSION);

    }

이거랑 다른건가요??

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 2
© SIRSOFT
현재 페이지 제일 처음으로