database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Tutorials 16214 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 16214
FILE Upload 와 MySQL BLOB 화일 입출력
작성자
정재익(advance)
작성일
2002-06-11 12:28
조회수
17,556

출처 :

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)이 도서의 표지 이미지를 이 방식으로 관리합니다.

 

그럼 다은 시간까지 여러분 모두 안녕히....

이 글에 대한 댓글이 총 1건 있습니다.

정재익 님이 작성하신 -FILE Upload 와 MySQL BLOB 화일 입출력- 잘 보았네요.

화일 입출력 문제로 여기 저기 기웃거리다 마지막 찾은 곳이 이글 같은데요.

찾을분이 혹시 계실까 해서 좀 덧 붙여 둡니다.


예 1 은 되는지 안되는지 몰겠음.



예 1)


chmod($_FILES['file_a']['tmp_name'], 0644);

$qs  = "INSERT INTO table SET ";

$qs .= " FILE_A = LOAD_FILE('{$_FILES['file_a']['tmp_name']}'),

FILE_TYPE = '{$_FILES['file_a']['type']}'

;";


예 2)


$file_data = addslashes(fread(fopen($_FILES['file_a']['tmp_name'], "r"), filesize($_FILES['file_a']['tmp_name'])));

$qs  = "INSERT INTO table SET ";

$qs .= " FILE_A = '{$file_data}',

FILE_TYPE = '{$_FILES['file_a']['type']}'

;";

jw님이 2007-02-16 01:50에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
16444MySQL에서 한글 정렬
정재익
2002-07-09
6892
16443해당 날짜에 DB update 하기
정재익
2002-07-09
6148
16215Window용 SQL 이해 및 MySQL 서버 기초
정재익
2002-06-11
10193
16214FILE Upload 와 MySQL BLOB 화일 입출력 [1]
정재익
2002-06-11
17556
16213MySQL Table Joins
정재익
2002-06-11
8629
15438mysqld_error code [1]
김순석
2002-03-12
11041
15180[참고자료-질문/답] mysql 최적화 관련
문태준
2002-02-16
11524
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다