스프링(Spring) Byte[] 통해서 MariaDB BLOB 이미지 Insert 하기

https://infondgndg91.blogspot.com/2018/07/input-typefile-multiple.html 에서

<input type="file multiple />태그를 이용해서 이미지를 브라우저 화면에서 업로드하고 뿌려주는 작업을 해보았다.
지금부터 얘기할 작업은 MultipartHttpServletRequest를 통해서 이미지파일들을 Controller에서 byte 배열로 처리해주고 MariaDB의 BLOB 타입의 컬럼에 인서트 하는 일이다.

먼저 pom.xml에 file업로드 관련 디펜던시를 추가해준다.
버전은 호환성에 맞게 알아서 맞춰주어야 할 것 같다.
<!-- file업로드 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>


본인의 환경설정 경로는 아래와 같이 web.xml에 되어있다.
<!-- 스프링의 환경설정 파일 로딩 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

root-context.xml파일에 아래와 같이 multipartResolver를 등록한다.

<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="-1"></property>
</bean>


다음은 Controller부분이다. jsp에서 넘어오는 이미지 파일들을  MultipartHttpServletRequest 통해서 byte배열로 처리해준다.
@Inject private ImagesService imagesService; @RequestMapping("/insertImgs.do") public ModelAndView newWorkSpaceForAdmin(ModelAndView mv, MultipartHttpServletRequest multipartHttpServletRequest, ImagesDTO imagesDTO) throws IOException {; List<MultipartFile> multipartFiles = multipartHttpServletRequest.getFiles("files[]"); if(multipartFiles.size() == 1) { imagesDTO.setImg(multipartFiles.get(0).getBytes()); }else if(multipartFiles.size() ==2) { imagesDTO.setImg(multipartFiles.get(0).getBytes()); imagesDTO.setImg2(multipartFiles.get(1).getBytes()); }else if(multipartFiles.size() == 3) { imagesDTO.setImg(multipartFiles.get(0).getBytes()); imagesDTO.setImg2(multipartFiles.get(1).getBytes()); imagesDTO.setImg3(multipartFiles.get(2).getBytes()); } imagesService.insertImages(imagesDTO); mv.setViewName("redirect:/getImgsList.do"); return mv; }


다음은 Service부분이다. 

 @Inject private ImagesDAO imagesDAO; public void insertImages(ImagesDTO imagesDTO) { imagesDAO.insertImages(imagesDTO); }

다음은 DAO부분이다.
 @Inject private SqlSession sqlSession; @Override public void insertImages(ImagesDTO imagesDTO) { sqlSession.insert("images.insertImages", imagesDTO); }
다음은 쿼리문이 있는 xml 부분이다.
<mapper namespace="images"> <insert id="insertImages" parameterType="images"> INSERT INTO TB_IMAGES_TEST(IMG,IMG2,IMG3) values(#{img},#{img2},#{img3}); </insert> </mapper>

본인은 mybatis 를 사용했다. 설정에서 typeAliase나 mapper 설정은 생략하겠다.
다음은 DTO 부분이다.

public class ImagesDTO { private byte[] img; private byte[] img2; private byte[] img3; public byte[] getImg() { return img; } public void setImg(byte[] img) { this.img = img; } public byte[] getImg2() { return img2; } public void setImg2(byte[] img2) { this.img2 = img2; } public byte[] getImg3() { return img3; } public void setImg3(byte[] img3) { this.img3 = img3; } }


컬럼 타입은 mediumblob으로 설정해주었다.
이미지 크기에 따라서 blob데이터 타입의 크기를 설정해주면 될 것 같다.

댓글

이 블로그의 인기 게시물

About JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째