
브라우저에서 파일을 업로드할 때, 파일을 서버로 업로드하는 기능을 제공하는 파일 업로드 컨트롤을 HTML 폼에 포함해야 한다.
방문자가 파일을 업로드할 수 있는 HTML 폼을 만들 때, 여는 <form> 태그에는 다음의 세 가지 속성이 있어야 한다.
파일 업로드 컨트롤은 HTML <input> 요소를 사용하여 생성된다. 이것의 type 속성에는 파일값이 있어야 한다. 브라우저에서 사용자가 업로드하고자 하는 파일을 선택할 수 있는 새로운 창을 여는 버튼이 생성된다.
<input type="file" name="image">
다른 폼 컨트롤처럼, 파일 입력 컨트롤은 이름/값 쌍을 서버로 보낸다.
사용자가 업로드할 수 있는 파일의 타입을 제한하기 위해 파일 입력 컨트롤에는 accept 속성이 있다. 이 속성의 값은 사이트가 허용하는 미디어 타입들을 콤마로 구분하여 나열되어야 한다.
<input type="file" name="image" accept="image/jpeg, image/png">
만약에 accept 속성이 사용되면, 방문자가 파일을 업로드하기 위해 버튼을 클릭할 때 최신 브라우저는 허용하지 않는 타입의 파일은 선택할 수 없도록 비활성화될 것이다.
미디어 타입의 모든 하위 타입을 허용하려면 하위 타입을 나열하는 대신에 애스터리스크asterisk, (*) 문자를 사용할 수 있다. 다음은 모든 이미지 타입을 허용하는 것이다(BMP, GIF, JPEG, PNG, TIFF, 및 WebP 포함).
<input type="file" accept="image/*">
파일이 웹 페이지를 통해 업로드되면, 웹 서버는 파일을 임시 폴더에 저장하고 PHP 인터프리터는 $_FILES라는 슈퍼글로벌 배열에 파일에 대한 세부 정보를 저장한다.
폼은 여러 개의 파일 업로드 컨트롤을 가질 수 있으므로, PHP 인터프리터는 폼이 전송하는 각 파일 업로드 컨트롤에 대해 $_FILES라는 슈퍼글로벌 배열에 요소를 생성한다.
요소의 이름은 파일 업로드 컨트롤의 이름과 일치하며, 이 요소의 값은 폼 컨트롤을 통해 업로드된 파일의 데이터 배열이다.
아래의 표는 업로드된 각 파일에 대해 $_FILES 슈퍼글로벌 배열이 저장하는 정보를 보여준다.
키 => 값 => 값에 접근하는 방법
- name => 파일명 => $_FILES[ 'image' ][ 'name' ]
- tmp_name => 파일의 임시 위치(PHP 인터프리터가 설정함) => $_FILES[ 'image' ][ 'tmp_name' ]
- size => 파일 크기(바이트) => $_FILES[ 'image '][ 'size' ]
- type => 미디어 타입(브라우저에 따라 다름) => $_FILES[ 'image' ][ 'type' ]
- error => 파일이 성공적으로 업로드되면 0, 문제가 있으면 오류 코드 => $_FILES[ 'image' ][ 'error' ]
파일이 업로드되면, PHP 코드는 업로드 오류가 없는지 확인해야 한다.
if ($_FILES['image']['errors'] === 0) { // 이미지 처리 } else { // 오류 메시지 표시 }
PHP의 move_uploaded_file() 함수는 임시 위치의 파일을 서버에 저장해야 하는 위치로 이동시킨다.
파일이 서버로 업로드되면, 임시 파일명이 지정되고 임시 폴더에 저장된다(PHP 인터프리터가 임시 파일명을 생성한다).
스크립트의 실행이 끝나면 PHP 인터프리터는 이 폴더의 임시 파일을 삭제할 것이다. 따라서 서버로 업로드된 파일을 저장하려면 다른 폴더로 파일을 옮기기 위해 move_uploaded_file() 함수를 호출해야 한다. 이 함수는 두 개의 매개변수를 갖는다.
이 함수는 새로운 위치로 파일을 이동하는 데 성공했다면 true를 반환한다. 그렇지 않다면 false를 반환한다.
목적지(파일이 저장되어야 하는 위치)는 다음으로 구성된다.
업로드된 파일의 원래 이름을 사용하려면 해당 파일에 대해 PHP 인터프리터가 생성한 배열에서 원래 파일명을 얻을 수 있다. 그것의 키는 name이다.
다음은 $destination라는 변수에 대상 파일 경로가 저장된다. 업로드 폴더를 지정하고 그다음으로 이미지를 업로드할 때 사용했던 파일의 원래 이름을 지정하여 생성한다.
$destination = '../uploads/' . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], $destination);
대상 디렉터리에 대한 권한은 다음과 같아야 한다.
PHP의 move_uploaded_file() 함수는 파일을 이동하기 전에 파일이 HTTP POST를 통해 업로드되었는지를 확인한다. 만약에 파일을 다른 곳으로 옮기기 전에 미리 사용해야 한다면, PHP의 is_uploaded_file() 함수를 사용하여 이러한 검사를 수행한다(이것은 다른 사람이 파일에 접근하는 것을 막아준다).
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022