테스트 사이트 - 개발 중인 베타 버전입니다

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

아티스츠그라운드 11개월 전 조회 2,372

안녕하세요

 

펑션, 인자값

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개

채택된 답변
+20 포인트
glitter0gim
11개월 전

※ 업로드 경로를 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개

아티스츠그라운드
11개월 전
우와... 이렇게 디테일하게 적어주시다니.. 너무 감사합니다...ㅜㅜ 감동이에요!!!
g
glitter0gim
11개월 전
~/_

댓글을 작성하려면 로그인이 필요합니다.

11개월 전

이미 임시파일을 업로드해서 해당 임시파일이 더 이상 없습니다. 업로드 한 파일을 복사 하는 형식으로 바꾸셔야 합니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

11개월 전

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

아티스츠그라운드
11개월 전
혹시 그 기능이 위 function안에 있는
if(!is_dir($dir)) {

@mkdir($dir, G5_DIR_PERMISSION);

@chmod($dir, G5_DIR_PERMISSION);

}

이거랑 다른건가요??

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인