Spring-JSP

[Spring-JSP] Thumbnailator-이미지/jcodec-비디오 업로드시 썸네일 만들고 저장하기

Jeong Jeon
반응형

이미지 업로드하고, 썸네일 만들어서 저장하려고 한다.

일단 다른 로직 제외하고 썸네일쪽만 보려고 한다.

 

1). pom.xml

<Maven>

Dependency를 추가해준다.

이미지 썸네일 만들때는 Thumbnailator를 사용

비디오 썸네일 만들때는 imgscalr과 jcodec을 사용

파일업로드는 commons-io 를 사용

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3</version>
</dependency>

//이미지 썸네일 만들때 사용Library
<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.11</version>
</dependency>

//비디오 썸네일 만들때 사용Library
<dependency>
	<groupId>org.imgscalr</groupId>
	<artifactId>imgscalr-lib</artifactId>
	<version>4.2</version>
</dependency>
<dependency>
	<groupId>org.jcodec</groupId>
	<artifactId>jcodec</artifactId>
	<version>0.1.9</version>
</dependency>
<dependency>
	<groupId>org.jcodec</groupId>
	<artifactId>jcodec-javase</artifactId>
	<version>0.1.9</version>
</dependency>

 

 

2). ServiceImple.java

이미지 / 비디오 파일 받아서 썸네일 만드는과정 설명

@Override
	public HashMap<String, Object> addFileImgVideo(MultipartHttpServletRequest mRequest, HttpServletRequest request,HttpServletResponse response,
			Locale locale) throws Exception {
		HashMap<String, Object> resultMap = new HashMap<String, Object>();
		
		try {
			//로컬 파일 저장 경로
			String uploadRealPath = env.getProperty("file.upload.realPath");
			//웹리소스 경로
			String resourcePath = env.getProperty("file.dir.path");

			File baseDir = new File(uploadRealPath);
			//경로가 없다면 경로 생성( 권한 필요 )
			if(!baseDir.exists()) {
				baseDir.mkdirs();
			}
			ArrayList<FileVo> fileVoList = new ArrayList<FileVo>();
			File dir = new File(uploadRealPath);

			//경로가 없다면 경로 생성( 권한 필요 )
			if(!dir.exists()) {
				dir.mkdirs();
			}
            
            MultipartFile multipartFile = mRequest.getFile("upload-file");
			String resourceThumbUrl = "";
			if(!StringUtils.isEmpty(multipartFile)) {
            	File folderDir = new File(uploadRealPath + code);
				//경로가 없다면 경로 생성( 권한 필요 )
				if(!folderDir.exists()) {
					folderDir.mkdirs();
				}
                //일반 파일명
                String resourceName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(multipartFile.getOriginalFilename());
				byte[] bytes = multipartFile.getBytes();
				Path path = Paths.get(uploadRealPath+ code + resourceName);
                //일반 파일 저장
				Files.write(path, bytes);
                //썸네일 사이즈
				int width = 120;
				int height = 120;
                if(multipartFile.getContentType().startsWith("image")) {
					try {
						resourceThumbUrl = resourcePath + code  + this.makeThumbnailByImage(width, height, path.toString(), resourceName, FilenameUtils.getExtension(multipartFile.getOriginalFilename()), uploadRealPath);
					}catch (Exception e) {
						resultMap.put("result", Constant.XHR_REQUEST_FAIL);
						return resultMap;
					}
				}else if(multipartFile.getContentType().startsWith("video")) {

					try {
						resourceThumbUrl = resourcePath + code  + this.makeThumbnailByVideo(width, height, path.toString(), resourceName, env.getProperty("thumb.file.extension"), uploadRealPath);
					}catch (Exception e) {
						resultMap.put("result", Constant.XHR_REQUEST_FAIL);
						return resultMap;
					}
				}else {
					resultMap.put("result", Constant.XHR_REQUEST_FAIL);
					return resultMap;
				}
            }
       }catch (Exception e) {
			e.printStackTrace();
			resultMap.put("result", Constant.XHR_REQUEST_FAIL);
			return resultMap;
		}
 }

/*이미지 썸네일파일 저장*/
private String makeThumbnailByImage(int width, int height, String filePath, String fileName, String fileExt, String uploadPath) throws Exception {
		//.of(filePath or file객체)로 파일을 읽고, 스케일을 조정하고, .toFile()로 정해진 파일경로/파일명으로 파일을 저장한다.
		Thumbnails.of(filePath).scale(0.5).toFile(uploadPath + THUMBNAIL_PREFIX + fileName);
		return THUMBNAIL_PREFIX + fileName;
}

/*비디오 썸네일파일 저장*/
private String makeThumbnailByVideo(int width, int height, String filePath, String fileName, String fileExt, String uploadPath ) throws Exception{
		File video = new File(filePath);
		double frameNumber = 0d;
		SeekableByteChannel bc = NIOUtils.readableFileChannel(video);
		MP4Demuxer dm = new MP4Demuxer(bc);
		DemuxerTrack vt = dm.getVideoTrack();
		frameNumber = vt.getMeta().getTotalDuration() / 5.0;
		Picture frame = FrameGrab.getNativeFrame(video, 0d);
		BufferedImage img = AWTUtil.toBufferedImage(frame);
		BufferedImage destImg = Scalr.resize(img, width, height);

		int pos = fileName .lastIndexOf(".");
		String _fileName = fileName.substring(0, pos);

		String thumbName = uploadPath + THUMBNAIL_PREFIX + _fileName;
		thumbName = thumbName + "." + fileExt;
		File thumbFile = new File(thumbName);
		//이미 파일이 존재할경우에는 저장하지 않는다.
		if (!thumbFile.exists()) {
			thumbFile.createNewFile();
		}
		ImageIO.write(destImg, fileExt.toUpperCase(), thumbFile);
		img.flush();
		destImg.flush();
		return THUMBNAIL_PREFIX + _fileName + "." + fileExt;
}

 

후하후하

반응형