파일은 여러 가지 있습니다. 그중에서는 작은 크기의 파일이 있고 큰 크기의 파일이 있을 수도 있습니다. 따라서 이번에는 큰 파일을 제한하는 방식에 대해서 알아보겠습니다.

위와 같이 파일 용량이 큰 파일을 한번 업로드 해보겠습니다.

파일을 업로드했더니 해당 오류가 나타나는 걸 볼 수 있습니다. 해당 오류를 살펴보면 우리가 사용할 수 있는 파일의 용량의 최대 크기는 41943040라는 걸 알 수 있습니다. 그렇다면 41943040Bytes는 MB로 환산하면 얼마일까요?

41943040Bytes는 40MB라는 걸 알 수있습니다. 그런데 지금 우리가 올린 파일의 용량은 326967915Bytes로 이걸 다시 MB로 환산해보면 얼마일까요?

311MB 정도 나오는 걸 볼 수 있는데 이는 우리가 사용 가능한 용량보다 훨씬 큰 크기입니다. 따라서 우리는 해당 파일을 업로드할 수가 없는 거죠. 그리고 해당 오류를 잘 보면 에러 라인에서 0이라는 값을 반환하는데 이러한 문제점은 프로그램 자체의 문제가 아니라 프로그램 설정 자체 발생하는 이슈라고 볼 수 있습니다. 그러면 이러한 부분을 Backend 부분에서 어떻게 막을 수 있는지 확인해 보겠습니다.

XAMPP를 설치하셨다면 해당 폴더 안에 PHP라는 폴더를 열어줍니다. 해당 폴더 안에는 PHP.ini라는 파일이 하나 존재합니다. 해당 파일은 PHP 관련된 설정을 정의하는 곳이라고 보면 됩니다.

1. 첫 번째 방법으로는 post_max_size라는 설정이 있는데 이거는 파일 용량이 아니라 전체적으로 업로드되는 크기를 의미합니다. 초깃값으로는 40M로 설정돼있지만 필자는 400M까지 늘려주었습니다.

2. 두 번째 방법으로는 upload_max_filesize라는 설정값이 존재하는데 해당 설정은 각각의 파일의 용량을 설정하는 건데 이것도 기본값은 40M으로 설정돼있지만 필자는 400M으로 바꾸었습니다.
설정을 바꾸었다면 그대로 사용할 수 있는 게 아니라 WebServer를 한번 종료하고 다시 실행시켜줘야 합니다. 필자는 XAMPP에 있는 Apache를 WebServer로 사용하고 있기 때문에 해당 웹서버를 닫고 다시 실행시켜줍니다.



전에 파일 크기가 커서 올리지 못했던 파일을 다시 한 번 더 올려보겠습니다.

이제는 용량이 큰 파일도 올라갈 수 있습니다. DB에서는 어떻게 되었는지 확인해 보겠습니다.

정상적으로 DB에도 파일이 제대로 들어가 있는 걸 볼 수 있습니다.

exe 파일이라 이미지는 없지만 정상적으로 board 폴더에 저장된 걸 볼 수 있습니다.

다시 원래대로 PHP.ini 파일을 수정한 후 용량이 큰 파일을 보내면 에러 메시지를 보내줍니다. 그런데 이러한 문구는 보통 개발자들이나 이해하고 넘어가는 영역이지 일반회원 입장에서는 상당히 진입장벽이 높은 오류입니다. 그래서 우리는 해당 오류를 가지고 Ajax 통신할 때처럼 글쓰기 페이지에서 일반회원에게 맞게 오류를 설명해 줘야 할 필요가 있습니다.
이러한 문제점을 고치는데 앞서 해당 오류는 문법적인 오류나 프로그램 등의 오류가 아니기 때문에 다시 PHP.ini 설정 파일을 건드려서 다루어야 합니다.

설정 파일에서 display_errors=ON이라는 부분이 있는데 이 값을 Off로 설정하면 더 이상 해당 에러 메시지가 보이지 않게 됩니다.

원래 같이 있었던 오류메시지 하나가 없어지고 json 문자열만 덩그러니 있는 걸 볼 수 있습니다. 이제 우리는 에러 메시지를 catch 하는 기능을 사용할 겁니다.

$error_arr = error_get_last();
print_r($error_arr);
해당 코드는 마지막으로 발생한 오류를 가져오는 함수입니다. 그리고 오류메시지는 전에 PHP 설정 파일에서 숨겼던 오류메시지와 동일합니다.

print_r($_SERVER);
exit;
$_SERVER는 슈퍼 전역변수로 여기에는 $_GET, $_POST, $_COOKIE, $_REQUEST, $_FILES, $_SESSION, $_ENV, $GLOBALS가 있습니다. $_SERVER는 서버와 관련된 여러 가지 값을 담고 있습니다. 위와 같이 [CONTENT_LENGTH] => 108254335라는 부분은 파일 크기에 대한 정보가 들어있습니다. 해당 파일을 계산해 보면 103MB 정도 나옵니다. 그다음 PHP 설정값에서 post_max_size를 가지고 서버 값에 저장된 파일 크기와 비교를 해주면 됩니다.

$a = ini_get("post_max_size");
echo $a;
exit;
현재 설정된 파일의 크기는 40MB로 설정되어 있습니다. 이제 이 값을 가지고 위에 서버 값에 포함된 파일 크기와 똑같은 단위로 맞춰주고 그 값을 비교하여 용량을 제한해보겠습니다.
// 현재 첨부 파일 크기 > PHP 설정 크기 => Error
if (isset($_SERVER["CONTENT_LENGTH"]) && $_SERVER["CONTENT_LENGTH"] > (int) ini_get("post_max_size") * 1024 * 1024) {
$arr = ["result" => "post_size_exceed"];
die(json_encode($arr));
}
서버 값과 PHP 설정값을 비교하는 구문입니다. 현재 post_max_size 값은 40MB이므로 여기에 1024*1024를 하여 Btyes로 단위를 맞춰줬습니다.

else if (data.result == "post_size_exceed") {
alert("첨부 파일의 용량이 너무 큽니다. 최대 용량 : 40MB")
id_attach.value = ""
return false
}
넘어온 json 문자열을 가지고 해당 조건에 맞으면 다음과 같은 알림을 띄웁니다.
다음 시간에는 자바스크립트로 파일 크기 제한 및 확장자 제한하기를 해보겠습니다.
긴 글 봐주셔서 감사합니다.