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, 1, 2)) = 'BM' OR String(BlobMid(imagedata, 1, 2)) = 'GI' ) AND Upper(arg_compmode) = 'JPG' THEN MessageBox('오류','잘못된 사진 파일 입니다. 확인하시고 다시 시도해주세요.') RETURN 0 END IF // 이하 생략... | cs |