dev/powerbuilder

DataBase에 저장된 JPG, BMP, GIF 구분하기

두억시니 2008. 10. 17. 15:55

Question

사진 파일을 DataBase(blob)에 저장을 해두었습니다. 근데 사진을 올릴때 확장자가 다른 사진들이 함께 들어가있습니다. (JPG, BMP, GIF 등등) 모든 사진을 특정 디렉토리에 내려받았는데(모든 확장자를 JPG로), 어떤 것은 보이고 어떤 것은 보이지 않고 해서 알고보니 확장자의 문제더군요. 일일이 수정하기 힘들어서 이렇게 질문을 합니다.



Answer

일반적으로는 이미지를 DataBase에 저장할 때 확장자나 파일의 이름을 다른 컬럼으로 저장을 합니다. 그런 방식으로 안되어 있으시다면 다음과 같은 방법을 적용해 보는건 어떠실런지요. 이건 정석이 아니라 말씀드리기 좀 그렇지만 이런 편법적인 방법이라도 도움이 되실까해서 답변 드립니다.
*.BMP, *.GIF, *.JPEG 파일들을 일반 Editor(UltraEditor, EditPlus)에서 열어 보시면, 가장 첫 문자로 공통적으로 찍히는 부분이 있을 것입니다. BMP일 경우 BM, GIF일 경우 GIF, JPEG 파일은 깨진 이상한 문자가 보이네요. SELECTBLOB 으로 읽어낸 데이터의 첫 2자리를 잘라서 BM인지, GI인지 이 둘다 아닌경우는 JPEG가 됩니다. 이런식으로 처리를 해보시는건 어떠실런지요. SELECTBLOB 으로 읽어서 INTO한 변수를 BlobMid() 함수로 두자리를 잘라서 비교를 해보는 것이지요. 적용시켜 보십시오.


Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Int loops, k, li_complete
Long bytes_read, lgth, ncnt
Blob b, imagedata, imagedata2
String ls_version, cDate, cTime, ls_path, file_path

cDate = String(Curday(), 'yyyymmdd')
cTime = String(Curday(), 'hhmmss')

// 사진파일을 resource폴더에 write
ls_path = cgResourceDir + "\TEMP\"
file_path = ls_path + arg_filename

// 파일읽을 횟수
IF arg_filelength > 32765 THEN
    IF Mod(arg_filelength, 32765= 0 THEN
        loops = arg_filelength / 32765
    ELSE
        loops = (arg_filelength / 32765+ 1
    END IF
ELSE
    loops = 1
END IF

// 파일읽기
FOR k = 1 TO loops
    bytes_read = FileRead(arg_fnum, b)
    imagedata = imagedata + b
NEXT

// Blob 변수에 제대로 들어갔는지 크기로 확인
lgth = Len(imagedata)

// 사진 확장자 오류 확인
IF ( String(BlobMid(imagedata, 12)) = 'BM' OR String(BlobMid(imagedata, 12)) = 'GI' ) AND Upper(arg_compmode) = 'JPG' THEN
    MessageBox('오류','잘못된 사진 파일 입니다. 확인하시고 다시 시도해주세요.')
    RETURN 0
END IF

// 이하 생략...
cs


아주 간단하게 System에 적용시켜보았다. 이걸 몰라서 하루 종일 책을 찾아봤더니 조금 억울하네. (ㅠ_ㅜ)흑~