반응형
이미지 업로드하고, 썸네일 만들어서 저장하려고 한다.
일단 다른 로직 제외하고 썸네일쪽만 보려고 한다.
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;
}
후하후하
반응형
'Spring-JSP' 카테고리의 다른 글
[Java-Basic] Method.Invoke()란? 가벼운 사용방법(메서드실행) (0) | 2021.04.15 |
---|---|
[Spring-JSP] Custom Annotation을 이용한 AOP 만들기 (0) | 2021.04.15 |
[Spring-JSP] Rest API 사용하기 (0) | 2021.03.03 |
[Spring-JSP] 엄청쉬운 Apache Poi Excel 양식다운로드 기능구현 / 테이블 참조 (0) | 2021.02.23 |
[Spring-JSP] 엄청쉬운Poi Excel 업로드 기능 구현 (0) | 2021.02.17 |