이미지 & 파일(1)

minah moon·2023년 8월 16일

PHP

목록 보기
28/58
post-thumbnail

브라우저에서 파일 업로드하기

브라우저에서 파일을 업로드할 때, 파일을 서버로 업로드하는 기능을 제공하는 파일 업로드 컨트롤을 HTML 폼에 포함해야 한다.

방문자가 파일을 업로드할 수 있는 HTML 폼을 만들 때, 여는 <form> 태그에는 다음의 세 가지 속성이 있어야 한다.

  • HTTP POST를 통해 폼을 보내도록(파일은 HTTP GET을 사용하여 보내지 말아야 한다) 지정하는 POST 값을 가진 method
  • 브라우저가 데이터를 보내기 위해 사용해야 하는 인코딩 타입을 지정하기 위해 multipart/form-data 값을 가진 enctype
  • 폼 데이터가 전송되어야 하는 PHP 파일을 값으로 가지고 있는 action

파일 업로드 컨트롤은 HTML <input> 요소를 사용하여 생성된다. 이것의 type 속성에는 파일값이 있어야 한다. 브라우저에서 사용자가 업로드하고자 하는 파일을 선택할 수 있는 새로운 창을 여는 버튼이 생성된다.

<input type="file" name="image">

다른 폼 컨트롤처럼, 파일 입력 컨트롤은 이름/값 쌍을 서버로 보낸다.

  • 이름은 해당 파일 컨트롤에 대한 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

0개의 댓글