낙서장/Spring

Spring Image DataBase Insert

RunTimeException 2022. 2. 21. 16:55

이미지 저장할 컬럼 데이터 타입은 BLOB으로 설정한다.

 

JSP

<!-- 이미지 업로드 설정을 위해 form tag에 enctype="multipart/form-data" 추가 -->
<form action="${pageContext.request.contextPath}/imgUpload.do" method="post" enctype="multipart/form-data">
    <input type="file" multiple="multiple" name="uploadImg">
    <input type="submit" value="upload">
</form>

 

Controller 

try {
    String fileName = uploadImg.getOriginalFilename();
    String extensions = fileName.substring(fileName.indexOf(".") + 1, fileName.length()).toLowerCase();

    UploadVO vo = new UploadVO();
    vo.setFileName(fileName);
    vo.setImage(uploadImg.getBytes()); //byte[]로 저장
    vo.setExtensions(extensions);

    service.imgUpload(vo);
} catch (Exception e) {
    e.printStackTrace();
}

 

Controller에서 VO 값 삽입 후 Service -> DAO -> Mapper -> DataBase로 순서로 삽입

 


DataBase Image Select 후 Web Page 출력작업

	List<UploadVO> list = new ArrayList<UploadVO>();
		List<Map<String, Object>> arr = null;
		BufferedInputStream bis = null;
		ByteArrayOutputStream bao = null;
		 
		byte[] buf = new byte[5 * 1024 * 1024];

		try {
			arr = dao.getImageList();

			for (int index = 0; index < arr.size(); index++) {
				UploadVO uvo = new UploadVO();
				Map<String, Object> vo = arr.get(index);

				Blob blob =(Blob) vo.get("IMAGE_BLOB");
								
				uvo.setFileName(vo.get("FILE_NAME").toString());
				uvo.setExtensions(vo.get("EXTENSIONS").toString());
				
				bis = new BufferedInputStream(blob.getBinaryStream());
				bao = new ByteArrayOutputStream();
				
				int read = 0;
				
				while((read = bis.read(buf, 0, buf.length)) != -1) {
					 bao.write(buf, 0 , read);
				}
				 uvo.setImage_base64("data:image/"+uvo.getExtensions()+";base64,"+Base64.getEncoder().encodeToString(bao.toByteArray()));
				 
				 list.add(uvo);
			}
		} finally {
			if (bis != null)
				bis.close();
			if(bao != null)
				bao.close();
		}

 

Blob 타입으로 받은 이미지 데이터를 InputStream 형태로 변형하고 byte []로 만들기 위해 OutputStream에 값을 넣는다.

 

웹 페이지 이미지 출력은 base64 형태로 출력하기 때문에 인코딩 작업 후 변수에 저장한다.