출처 :
http://phpschool.com/php_loveme/html/classroom_view.html?code=classroom&id=28
이번 시간에는 많은 관심의 대상이자 DB연동 CGI 프로그래밍의 하이라이트인 FILE Upload 와 MySQL BLOB 화일 입출력에 대해 알아보도록 하겠습니다.
간단한 이미지의 입출력이 가능한 Gallery 를 만들어 보았습니다.
BLOB 란 binary large object 입니다.
BLOB 컬럼 타입을 이용하면 일반적인 Int 나 char 와는 달리 이미지나 바이너리 화일을 테이블에 넣을 수 있죠!
BLOB 필드는 소팅이나 INDEX생성은 할 수 없습니다.
MySQL에서 지원하는 BLOB타입은 다음 4가지 입니다.
TINYBLOB (TINYTEXT)
- A BLOB or TEXT column with a maximum length of 255 (2^8 - 1) characters.
BLOB (TEXT)
- A BLOB or TEXT column with a maximum length of 65535 (2^16 - 1) characters.
MEDIUMBLOB (MEDIUMTEXT)
- A BLOB or TEXT column with a maximum length of 16777215 (2^24 - 1) characters.
LONGBLOB(LONGTEXT)
- A BLOB or TEXT column with a maximum length of 4294967295 (2^32 - 1)
characters.
그럼 우선 테이블을 만들어 보겠습니다.
본 강의에서는 아무나 사용할 수 있는 test DB를 사용하겠습니다.
SQL은 아래와 같습니다
-------------------------------------------------------------
use test ;
CREATE TABLE gallery1(
id int NOT NULL auto_increment,
image blob NOT NULL, # 이미지의 바이너리
title varchar(100) DEFAULT \ NOT NULL, # 이미지 제목
width smallint(6) DEFAULT \0\ NOT NULL, # 가로크기
height smallint(6) DEFAULT \0\ NOT NULL, # 세로크기
filesize int , # 파일크기
detail text , # 이미지 설명
PRIMARY KEY (id)
) ;
-------------------------------------------------------------
잘 만들어지죠?
자 먼저 실제로 한번 테스트 해 보세요. 너무 큰 그림은 올리지 마시고 기본적으로 확장자 검사를 하므로 gif, jpg, jpeg 화일을 업로드 할 수 있습니다.
PHP3 Gallery 예제
소스는 2개의 화일로 이루어져 있습니다.
이미지의 목록 출력 과 업로드 를 해 주는 루틴 :
gallery.html
실제 이미지의 바이너리를 출력해 주는 루틴 :
view.html
몇가지 주요 사항은 다음과 같습니다.
- 화일 업로드를 위해서는 FORM 태그를 사용합니다. 한가지 주의 할점은 파일전송을 위해반드시
enctype=\multipart/form-data\
부분이 태그 내부에 정의되어 있어야 합니다.
-전송할 화일은 를 통해 선택합니다.
이때 전송돤 화일은 서버상의 /tmp 디렉토리에 임시로 저장되며 임의이 이름이 부여됩니다.
이름은 $image 에 저장되며 실제 사용자 로컬 하드에서 사용되었던 이름은
$image_name 에 저장됩니다. 주의 하시기 바랍니다.
- 실제로 이미지를 테이블에 저장하는 핵심적인 루틴을 다음과 같습니다.
------------------------------------------------
$size = GetImageSize($image); // tmp 디렉토리에 올라온 이미지 크기
$width = $size[0];
$height = $size[1];
$imageblob = addslashes(fread(fopen($image, \r\), filesize($image)));
$filesize = filesize($image) ;
$que1=\ INSERT INTO gallery VALUES (\, \$imageblob\,\$title\, \$width\,
\$height\,\$filesize\, \$detail\ )\ ;
$result=mysql_query($que1,$connect );
------------------------------------------------
* GetImageSize() 함수는 이미지의 가로,세로 등등등 을 알려줍니다 (메뉴얼을 참고하시고)
------------------------------------------------
$imageblob = addslashes(fread(fopen($image, \r\), filesize($image)));
------------------------------------------------
위의 부분이 바로 화일을 읽어 그 크기만큼 DB저장 가능한 BLOB형태로 처리해 줍니다.
- 이미지를 출력해 주는 부분은
<img src=./view.html?id=$row[id] .. 인데요
실제 view.html 의 내부는 의외로 간단합니다.
DB에 접속한 후 다음과 같이 처리하면 됩니다.
------------------------------------------------
$que1=\select * from gallery where id=$id\ ;
$result=mysql_query($que1,$connect );
$row=mysql_fetch_array($result);
Header( \Content-type: image/jpeg\);
echo $row[image];
------------------------------------------------
이상으로 BLOB화일 입출력에 대해 간단히 알아 보았는데요
실제 UPLOAD 된 화일은 저장하는 방법에는 두가지가 있습니다.
1.업로드 된 화일을 서버의 특정 디렉토리에 복사하고 화일위치+이름을 테이블에 저장하는 방법으로 여러곳에서 사용이 가능하다고 입출력 루틴이 별도로 필요하지 않다는 장범이 있으나 화일이 수가 많아지면 관리가 힘들고 실제 파일에 변동이 생길경우 테이블의 내용을 업데이트 해 주는 루틴이 필요하게 됩니다.
2. 본 강의에서 사용한 방법으로 화일을 직접 DB 에 BLOB 형태로 넣는 겁니다.
별도의 입출력 루틴이 필요하지만 파일의 수가 많아질수록 유리합니다.
아마존(www.amazon.com)이 도서의 표지 이미지를 이 방식으로 관리합니다.
그럼 다은 시간까지 여러분 모두 안녕히....
|