PHP에서 받아온 파일 다루기

신주형·2023년 1월 24일
1

PHP

목록 보기
1/2
post-thumbnail

PHP에서 파일을 어떻게 받을까?

전 포스트에서 다뤘던대로 html에서 파일을 받아오면 파일에 대한 정보들을 php에선 $_FILES이라는 변수를 통해 받게 된다.

보통 PHP에선 $_FILES['user가 올린 파일 이름'] 이런 형식으로 사용한다.

PHP에서 파일을 받는 간단한 흐름

1. 파일의 데이터 정보를 POST 방식으로 받아온다.

2. 받은 내용을 $_FILES에 넣는다.

3. 2와 동시에 파일이 임시로 저장된다.

4. move_uploaded_file() 을 통해 임시저장되어있던 파일을 지정된 경로로 저장시킨다.

5. PHP 프로세스가 종료된다.

더 자세하게 본 흐름

1. html의 FORM 부분에서METHOD로 PHP로 보낼 방식을 선택할 수 있는데 POST로 설정하게 된다면 POST request를 받을 수 있다.

2. POST request으로 받은 정보(파일 이름, 크기 등)를 $_FILES에 저장한다. 이때 파일의 정보만 불러오는 것이지 파일 자체가 있는 것은 아니다.

3. 파일 정보는 보내고 파일 자체는 서버에 임시 저장된다. 보통tmp 파일이나 temp 파일에 저장되는데 확장자 명도 폴더 명을 따라 tmp로 되어있다. 더 자세하게 알고 싶을땐 PHP.ini 파일을 보면 File Uploads 부분에 있는 변수들을 보면 알수 있다.

  • file_uploads = ON/OFF
    파일의 업로드 가능여부를 조정한다.
  • upload_tmp_dir = 경로
    임시로 서버의 어디에 저장할것인지 (더 정확한 경로를 원한다면 sys_get_temp_dir() 함수를 사용할 수 있다.)
  • upload_max_filesize = 업로드크기
    업로드 할때 허용할 파일의 크기
  • max_file_uploads=20 = 개수
    한번 업로드 할때 올라가는 최대 파일 개수

4. 코드에 move_uploaded_file(임시로 저장된 파일 이름, 지정된 경로)를 통해 파일을 원하는 경로로 다시 저장할 수 있다. 파일 생성까지는 해주지 않아서 없는 경로를 넣으면 오류가 난다.

5. PHP 가 끝나게 된다고 해도 임시파일은 삭제되지 않는다. 그러므로 직접 삭제하거나 시간이 지나면 삭제해주는 코드를 만들기도 한다.

PHP에서 $_FILE 관련 함수

$_FILES['userfile']
['name']파일에 원래 이름
['type']파일의 mime 형식
['size']파일의 바이트로 표현한 크기
['tmp_name']서버에 저장된 임시 파일 이름
['error']파일 업로드에 관련한 에러 코드
['full_path']브라우저에서 제출한 전체 경로 (PHP 8.1.0부터 사용 가능)

move_uploaded_file : 서버에 저장된 파일을 원하는 파일의 경로로 옮긴다. 성공하면 true 실패하면 false 를 반환 해준다.

$_FILE 관련 에러 메세지

PHP 4.2.0부터, PHP는 파일 배열에 적절한 에러 코드를 반환했다. 에러 코드는 ['error'] 세그먼트에서 확인할 수 있다. 에러 코드는 PHP 4.3.0에서 상수 값이 되었다.

UPLOAD_ERR_OK 반환 값 : 0;
오류가 없고 파일을 성공적으로 업로드 하였다.

UPLOAD_ERR_INI_SIZE 반환 값 : 1;
업로드 된 파일이 php.ini의 upload_max_filesize를 초과하였다.

UPLOAD_ERR_FROM_SIZE 반환 값 : 2;
업로드 된 파일이 HTML 양식에 지정된 max_file_size를 초과하였다.

UPLOAD_ERR_PARTIAL 반환 값 : 3;
업로드 된 파일이 부분적으로만 업로드 되었다.

UPLOAD_ERR_NO_FILE 반환 값: 4;
업로드 된 파일이 없다.

UPLOAD_ERR_TMP_DIR 반환 값 : 6;
임시 폴더가 없다. PHP 5.0.3에서 도입되었다.

UPLOAD_ERR_CANT_WRITE 반환 값 : 7;
디스크에 파일을 쓰지 못했다. PHP 5.1.0에서 도입되었다.

UPLOAD_ERR_PARTIAL 반환 값: 8;
PHP 확장으로 인해 파일 업로드가 중지되었다. PHP는 파일 업로드를 중단시킨 확장자를 확인하는 방법을 제공하지 않는다. PHP 5.2.0에서 도입되었다. phpinfo()를 사용해 로드된 확장 목록을 살펴보는 것이 도움이 될 수도 있다.

0개의 댓글