전 포스트에서 다뤘던대로 html에서 파일을 받아오면 파일에 대한 정보들을 php에선 $_FILES이라는 변수를 통해 받게 된다.
보통 PHP에선 $_FILES['user가 올린 파일 이름'] 이런 형식으로 사용한다.
1. html의 FORM 부분에서METHOD로 PHP로 보낼 방식을 선택할 수 있는데 POST로 설정하게 된다면 POST request를 받을 수 있다.
2. POST request으로 받은 정보(파일 이름, 크기 등)를 $_FILES에 저장한다. 이때 파일의 정보만 불러오는 것이지 파일 자체가 있는 것은 아니다.
3. 파일 정보는 보내고 파일 자체는 서버에 임시 저장된다. 보통tmp 파일이나 temp 파일에 저장되는데 확장자 명도 폴더 명을 따라 tmp로 되어있다. 더 자세하게 알고 싶을땐 PHP.ini 파일을 보면 File Uploads 부분에 있는 변수들을 보면 알수 있다.
4. 코드에 move_uploaded_file(임시로 저장된 파일 이름, 지정된 경로)를 통해 파일을 원하는 경로로 다시 저장할 수 있다. 파일 생성까지는 해주지 않아서 없는 경로를 넣으면 오류가 난다.
5. PHP 가 끝나게 된다고 해도 임시파일은 삭제되지 않는다. 그러므로 직접 삭제하거나 시간이 지나면 삭제해주는 코드를 만들기도 한다.
$_FILES['userfile'] | |
---|---|
['name'] | 파일에 원래 이름 |
['type'] | 파일의 mime 형식 |
['size'] | 파일의 바이트로 표현한 크기 |
['tmp_name'] | 서버에 저장된 임시 파일 이름 |
['error'] | 파일 업로드에 관련한 에러 코드 |
['full_path'] | 브라우저에서 제출한 전체 경로 (PHP 8.1.0부터 사용 가능) |
move_uploaded_file : 서버에 저장된 파일을 원하는 파일의 경로로 옮긴다. 성공하면 true 실패하면 false 를 반환 해준다.
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()를 사용해 로드된 확장 목록을 살펴보는 것이 도움이 될 수도 있다.