package com.insoul.copartner.service.impl; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails; import net.coobird.thumbnailator.Thumbnails.Builder; import net.coobird.thumbnailator.geometry.Positions; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.insoul.copartner.constant.CommonConstant; import com.insoul.copartner.constant.ResponseCode; import com.insoul.copartner.constant.SettingConstant; import com.insoul.copartner.exception.CException; import com.insoul.copartner.exception.CExceptionFactory; import com.insoul.copartner.service.IMediaService; import com.insoul.copartner.util.CDNUtil; import com.insoul.copartner.util.FileUtil; import com.insoul.copartner.util.SystemUtil; @Service public class MediaServiceImpl extends BaseServiceImpl implements IMediaService { @Override public Map<String, String> uploadImage(MultipartFile imageFile, boolean needThumbnail) throws CException { String fileType = FileUtil.getFileType(imageFile.getOriginalFilename()); InputStream in = null; if (needThumbnail) { try { BufferedImage image = ImageIO.read(imageFile.getInputStream()); int imageWidth = image.getWidth(); int imageHeitht = image.getHeight(); int a = CommonConstant.IMAGE_STANDARD; ByteArrayOutputStream out = new ByteArrayOutputStream(); Builder<BufferedImage> builder = null; if (1.0f != (float) imageWidth / imageHeitht) { if (imageWidth > imageHeitht) { image = Thumbnails.of(imageFile.getInputStream()).height(a).asBufferedImage(); } else { image = Thumbnails.of(imageFile.getInputStream()).width(a).asBufferedImage(); } builder = Thumbnails.of(image).sourceRegion(Positions.CENTER, a, a).size(a, a); } else { builder = Thumbnails.of(image).size(a, a); } builder.outputFormat(fileType).toOutputStream(out); in = new ByteArrayInputStream(out.toByteArray()); } catch (Exception e) { throw CExceptionFactory.getException(CException.class, ResponseCode.FILE_UPLOAD_ERROR); } } else { Map<String, String> siteSettings = SystemUtil.getSettings(SettingConstant.GROUP_TYPE_IMAGE); if (null != siteSettings && siteSettings.size() > 0) { long maxSize = FileUtil.string2bytes(siteSettings.get(SettingConstant.IMAGE_MAX_SIZE)); long minSize = FileUtil.string2bytes(siteSettings.get(SettingConstant.IMAGE_MIN_SIZE)); String[] imageTyps = siteSettings.get(SettingConstant.IMAGE_TYPE_LIMIT).split(","); int maxWidth = Integer.valueOf(siteSettings.get(SettingConstant.IMAGE_DIMENSION_MAX_WIDTH)); int maxHeight = Integer.valueOf(siteSettings.get(SettingConstant.IMAGE_DIMENSION_MAX_HEIGHT)); int minWidth = Integer.valueOf(siteSettings.get(SettingConstant.IMAGE_DIMENSION_MIN_WIDTH)); int minHeight = Integer.valueOf(siteSettings.get(SettingConstant.IMAGE_DIMENSION_MIN_HEIGHT)); FileUtil.validateImage(imageFile, maxSize, minSize, imageTyps, maxWidth, minWidth, maxHeight, minHeight); } try { in = imageFile.getInputStream(); } catch (IOException e) { throw CExceptionFactory.getException(CException.class, ResponseCode.FILE_UPLOAD_ERROR); } } String fileName = new StringBuilder().append(UUID.randomUUID()).append(".").append(fileType).toString(); String path = CDNUtil.uploadFile(in, fileName); Map<String, String> result = new HashMap<String, String>(); result.put(CommonConstant.IMAGE_PATH, path); result.put(CommonConstant.ORIGINAL_IMAGE_URL, CDNUtil.getFullPath(path)); return result; } @Override public Map<String, String> uploadVedio(MultipartFile vedio) throws CException { Map<String, String> siteSettings = SystemUtil.getSettings(SettingConstant.GROUP_TYPE_VEDIO); if (null != siteSettings && siteSettings.size() > 0) { long maxSize = FileUtil.string2bytes(siteSettings.get(SettingConstant.VEDIO_MAX_SIZE)); long minSize = FileUtil.string2bytes(siteSettings.get(SettingConstant.VEDIO_MIN_SIZE)); String[] imageTyps = siteSettings.get(SettingConstant.VEDIO_TYPE_LIMIT).split(","); FileUtil.validateFile(vedio, maxSize, minSize, imageTyps); } String fileType = FileUtil.getFileType(vedio.getOriginalFilename()); String fileName = new StringBuilder().append(UUID.randomUUID()).append(".").append(fileType).toString(); String path = null; try { path = CDNUtil.uploadFile(vedio.getInputStream(), fileName); } catch (IOException e) { throw CExceptionFactory.getException(CException.class, ResponseCode.FILE_UPLOAD_ERROR); } Map<String, String> result = new HashMap<String, String>(); result.put(CommonConstant.PATH, path); result.put(CommonConstant.ORIGINAL_URL, CDNUtil.getFullPath(path)); return result; } @Override public boolean deleteMedia(String media) throws CException { return CDNUtil.deleteFile(media); } @Override public Map<String, String> uploadDoc(MultipartFile doc) throws CException { String fileType = FileUtil.getFileType(doc.getOriginalFilename()); String fileName = new StringBuilder().append(UUID.randomUUID()).append(".").append(fileType).toString(); String path = null; try { path = CDNUtil.uploadFile(doc.getInputStream(), fileName); } catch (IOException e) { throw CExceptionFactory.getException(CException.class, ResponseCode.FILE_UPLOAD_ERROR); } Map<String, String> result = new HashMap<String, String>(); result.put(CommonConstant.PATH, path); result.put(CommonConstant.ORIGINAL_URL, CDNUtil.getFullPath(path)); return result; } }