CI 묻고 답하기

제목 exe 설치 파일 업로드가 안되는 문제
카테고리 CI 2, 3
글쓴이 정수리 작성시각 2020/05/27 10:43:59
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 16124   RSS

자료실 게시판에

exe 확장자인 설치파일을 업로드 하려고 합니다.

로컬에서 정상적으로 테스트 해보았지만

테스트서버에 코드를 올린 후 테스트를 해보았는데 올라가지 않아

에러코드를 출력해보니

The filetype you are attempting to upload is not allowed. 에러를 출력합니다.

검색을 통해 config/mimes.php에  'exe' 확장자를 찾아 $_FILE배열에서 키값이 type인 부분의 값을

넣어주면 해결된다고하여

$_FILE배열에서 키값이 type부분의 값과 config/mimes.php 파일에서 키값이 'exe' 값을 확인해보니

'exe'	=>	array('application/octet-stream', 'application/x-msdownload')

이미 포함되어 있는 값입니다.(application/x-msdownload)

아파치 에러로그의 경우 

File does not exist 에러를 출력 확인했습니다.

이부분의 파일을 존재하지 않다고하는데 실제로 로컬에 존재하는 파일이고 다른 확장자의 파일 업로드시에 정상적으로 업로드가 됩니다.

php.ini 파일업로드 설정의 경우

post_max_size  = 200

memory_limit = 512

upload_max_filesize =200 

로컬과 테스트서버는 동일합니다.

로컬에서는 정상적으로 모든파일이 올라는 상황이고

테스트서버에서는 다른파일은 업로드가 되나 exe 파일만 업로드가 안되는 상태 입니다.

이런 경우에는 어디서 부터 확인을해야 할까요?

(*업로드의 경우 드래그앤드랍형태로 파일을 올립니다)

$config['allowed_types'] = 'hwp|zip|xlsx|xls|pdf|png|gif|jpg|jpeg|JPG|GIF|JPEG|exe|txt';

$config['max_size'] = '204800'; //(KB)

$config['max_width'] = '2000';

$config['max_height'] = '2000';

 

function uploadFile(no){
    var formData = new FormData();//formdata:페이지전환없이 폼데이터 제출


    for(var i=0; i<uploadFileList.length; i++){

        formData.append('files[]', fileList[uploadFileList[i]]);

    }

    formData.append('token', $('input[name="token"]').val());//csrf token 값
    formData.append('id', $('input[name="id"]').val());//게시판 분류
    formData.append('category', $('select[name="category"]').val());//글분류 값


    $.ajax({

        url:hy_url+'cs/CsAjax/DropFileUpload/'+no,
        data:formData,
        type:'post',
        enctype:'multipart/form-data',
        processData:false,
        contentType:false,
        cache:false,
        async:false,

        success:function(data){

        },
        error:function(status, request, error){
                alert('파일업로드를 실패했습니다.\n업로드가능한 파일형식과 용량을 확인해주세요.');
                return false;
        }

    });

    }

}


 public function DropFileUpload()
    {
        $documentno = $this->url[3];

        if($_FILES)
        {

            $i = 0;
            foreach ($_FILES['files']['name'] as $name) {
                $arr['name'] = $name;
                $arr['type'] = $_FILES['files']['type'][$i];
                $arr['tmp_name'] = $_FILES['files']['tmp_name'][$i];
                $arr['error'] = $_FILES['files']['error'][$i];
                $arr['size'] = $_FILES['files']['size'][$i];
                $arr['id'] = $this->data['id'];//게시판 id

                $files = $this->functions->getFiles($arr); //파일업로드
                showArray($_FILES);업로드파일 정보 확인

                $data['documentno'] = $documentno;
                $data['documentid'] = 'hanayo_'.$arr['id'];
                $data['fullpath'] = 'data/hanayo_'.$this->data['id'].'/';
                $data['regdate'] = time();
                $data['type'] = 'F';
                $data['filename'] = $arr['name'];           //실제파일이름
                $data['size'] = $files['file_size'];        //(KB)
                $data['realname'] = $files['file_name'];    //암호화된 파일이름

                $this->_InsertFiles($data);
                $i++;
            }

        }

    }

)

 다음글 관라자/사용자 소스분리 문의 (2)
 이전글 view 부분 상단(헤더) include 는 어떻게 ... (2)

댓글

변종원(웅파) / 2020/05/27 10:49:32 / 추천 0

파일을 읽어서 실제 마임타입을 출력해보세요. 예로 확장자가 jpg 이지만 png로 나올 수도 있습니다. 

exe 읽어서 나온 타입을 mimes.php에 추가해주면 됩니다.

또는 exe의 경우 보안 문제 때문에 직접 업로드를 막는 곳이 많습니다. 업로드전에 zip으로 압축해서 올리는 것도 방법입니다.

정수리 / 2020/05/27 10:59:00 / 추천 0

@변종원(웅파)

답변감사합니다.

아직 제가 많이 부족하다보니 말씀하신 부분중에

파일을 읽어서 실제 마임타입을 확인하시는 부분을 이해를 못하겠네요

제가 그나마 알고 있는 것은

폼 전송으로 넘어온 $_FILES를 

print_r로 찍으면 나오는

Array
        (
            [name] => 37ebec97437223a296102f62848219103b511405.exe
            [type] => application/x-msdownload
            [tmp_name] => C:\Bitnami\wampstack-7.2.26-0\php\tmp\php9254.tmp
            [error] => 0
            [size] => 8145400
        )

이것으로 알고 있습니다.

저곳에서 

 [type] => application/x-msdownload 이부분을 확인하여 mimes.php 에 추가하는것으로 알고 있습니다.

저희 회사홈페이지 리뉴얼 중인데 자료실에 설치 파일을 올려야 하다보니 exe파일을 업로드가 가능해야된다고 해서요 ㅜㅜ

이전 홈페이지에서는 exe파일이 정상적으로 업로드가 되더라구요.

리뉴얼하면서 CI로 구성 중입니다.

변종원(웅파) / 2020/05/27 11:15:34 / 추천 0

해당 내용이 이미 mimes.php에 추가되어 있는데도 'The filetype you are attempting to upload is not allowed' 라는 에러가 난다면 파일타입 문제가 맞습니다. 

https://www.php.net/manual/en/function.mime-content-type.php

또는 https://stackoverflow.com/questions/968196/how-to-make-codeigniter-file-upload-class-accept-all-extensions 답변처럼 업로드된 파일의 타입을 실시간으로 판단하여 업로드 config를 선언하는 방법도 있습니다.

한대승(불의회상) / 2020/05/27 11:21:22 / 추천 0
보안에 민감하지 않다면 '*' 로 해도 됩니다.
정수리 / 2020/05/27 17:30:09 / 추천 0

@변종원

답변감사합니다.

실제로 확인해보니 mimes.php 설정되어 있는 기존값외의 값으로 확인되더라구요

새로추가 테스트해보니 잘 올라갑니다 ㅎ 정말 감사합니다.

application/x-dosexec - 이값으로 확인했어요