이미지 & 파일(2)

minah moon·2023년 8월 16일

PHP

목록 보기
29/58
post-thumbnail

파일명과 중복 파일 정리하기

임시 위치에 있는 파일을 이동하기 전에 다음을 수행해야 한다.

  • 파일명에서 문제가 생길 수 있는 문자를 제거한다.
  • 같은 이름을 가진 다른 파일을 덮어쓰지 않도록 한다.

앰퍼샌드, 콜론, 마침표, 그리고 공백과 같은 문자는 문제를 일으킬 수 있기 때문에 파일명에서 제거되어야 한다. 이를 위해 A-Z, a-z, 그리고 0-9 이외의 문자를 대시dash로 바꿀 수 있다.

  1. PHP의 pathinfo() 함수를 사용하여 파일의 베이스네임과 확장자를 얻는다.
$basename = pathinfo($filename, PATHINFO_FILENAME);
$extension = pathinfo($filename, PATHINFO_EXTENSION);
  1. PHP의 preg_replace() 함수를 사용하여 베이스네임에 있는 A-Z, a-z, 그리고 0-9 이외의 문자를 대시로 바꾼다.
$basename = preg_replace('/[^A-z0-9]/'. '-', $basename);
  1. 업로드 디렉터리, 베이스네임, 마침표, 그리고 파일 확장자를 결합하여 대상 파일 경로를 생성한다. 이 값은 변수에 저장되어야 한다.
$filepath = 'uploads/' . $basename . '.' . $extensions;
  1. 루프의 조건이 실행되어 새로운 파일명과 같은 이름의 파일이 존재하는지 검사하는 과정을 통해 각 파일은 고유한 파일명을 갖게 된다. 동일한 이름의 파일이 존재한다면, 파일이름 뒤에 숫자가 점점 늘어나게 된다.
$i = 1;
while (file_exists('uploads/' . $filename)) {
	$i = $i + 1;
    $filename = $basename . $i . '.' . $extension;

파일 크기와 파일 타입 확인하기

사이트에서 업로드된 파일을 가지고 작업할 수 있도록 하려면, 업로드된 파일을 다른 위치로 옮기기 전에 다음을 확인한다.

  • 파일이 너무 크지 않은지 확인한다(큰 파일은 다운로드 및 처리하는 데 시간이 더 많이 걸린다).
  • 사이트에서 해당 미디어 타입과 파일 확장자를 처리할 수 있는지 확인한다.

php.ini 또는 .htaccess에서 최대 파일 업로드 크기를 설정하거나, 업로드를 허용하는 파일의 크기를 제한하는 유효성 검증 코드를 페이지에 생성할 수 있다.

파일이 php.ini 또는 .htaccess에 설정된 최대 업로드 크기보다 더 큰지 확인하려면 $_FILES 배열을 살펴본다. 이러한 파일에 대한 error 키는 1의 값을 갖는다.

$_FILES 배열에서 파일의 크기도 확인할 수 있다. size 키는 해당 파일의 크기를 바이트 단위의 값으로 갖는다. 다음의 삼항 연산자 두 개는 이러한 검사를 수행한다.

  • 첫 번째 삼항 연산자는 오류 코드가 1인지 확인한다.
  • 두 번째 삼항 연산자는 파일의 크기가 5mb보다 큰지 확인한다.
$error = ($_FILES['image']['error'] === 1) ? 'Too large' : '';
$error = ($_FILES['image']['size'] <= 5242880) ? '' : 'Too large';

파일의 미디어 타입과 파일 확장자를 확인하는 것은 사이트가 파일을 안전하게 처리할 수 있게 해준다.

  1. $allowed_types는 허용되는 미디어 타입의 배열이다.
  2. PHP의 mime_content_type() 함수는 파일의 미디어 타입을 감지하여 $type에 저장한다.
  3. PHP의 in_array() 함수는 이 파일의 미디어 타입이 허용되는 미디어 타입의 배열에 있는지 확인한다.
  4. $allowed_exts는 허용되는 확장자의 배열을 저장한다.
  5. 파일명은 소문자로 변환되어 $filename에 저장된다.
  6. 파일 확장자를 수집하여 $ext에 저장한다.
  7. PHP의 in_array() 함수는 이 파일의 확장자가 허용되는 확장자의 배열에 있는지 확인한다.
$allowed_types = ['image/jpeg', 'image/png', 'image/gif',];
$type = mime_content_type($_FILES['image']['tmp_name']);
$error = in_array($type, $allowed_types) ? '' : 'Wrong file type';
$allowed_exts = ['jpeg', 'jpg', 'png', 'gif',];
$filename = strtolower($_FILES['image']['name']);
$ext  = pathinfo($filename, PATHINFO_EXTENSION));
$error .= in_array($ext, $allowed_exts) ? '' : 'Wrong extension ';





출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

감사합니다. 이런 정보를 나눠주셔서 좋아요.

답글 달기