package com.ycl.utils; import com.github.tobato.fastdfs.domain.fdfs.StorePath; import com.github.tobato.fastdfs.domain.upload.FastImageFile; import com.github.tobato.fastdfs.service.FastFileStorageClient; import com.ycl.dto.media.PictureZoomParameter; import com.ycl.dto.media.Media; import net.coobird.thumbnailator.Thumbnails; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import java.awt.image.BufferedImage; import java.io.*; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.regex.Pattern; @Component public class MediaFileUtil { private static MediaFileUtil self; @Value("${fdfs.groupName}") private String groupName; @PostConstruct private void init() { self = this; } @Autowired private FastFileStorageClient storageClient; private static final Pattern videoPattern = Pattern.compile("((mp4|flv|avi|rm|rmvb|wmv)(jpg|png|gif|bmp))"); @Value("${cfg.res}") private String rootPath; private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMM"); public MediaFileUtil() throws IOException { } public static String uploadImage(InputStream in) throws IOException { return self.storageClient.uploadImage(new FastImageFile(in, in.available(), "jpg", null)).getFullPath(); } public static String uploadImage(File file) throws IOException { FileInputStream in = new FileInputStream(file); return self.storageClient.uploadImage(new FastImageFile(in, in.available(), "jpg", null)).getFullPath(); } /** * 判断文件类型 * * @param fileName * @return */ public Short getType(String fileName) { String ext = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); if (".jpg".equals(ext) || ".jpeg".equals(ext) || ".png".equals(ext) || ".gif".equals(ext) || ".bmp".equals(ext)) { return 1; } else if (".mp4".equals(ext) || ".avi".equals(ext) || ".flv".equals(ext) || ".rm".equals(ext) || ".wmv".equals(ext)) { return 2; } else { return 0; } } public Media save(MultipartFile file, PictureZoomParameter zoomPar) throws Exception { String[] fs = file.getOriginalFilename().split("\\."); String ext = fs[fs.length - 1]; switch (this.getType(file.getOriginalFilename())) { case 1: return this.savePicture(file, ext, zoomPar); case 2: return this.saveVideo(file, ext); default: return new Media(); } } public String savePicture(InputStream inputStream, String ext) throws Exception { StorePath sp = storageClient.uploadFile(groupName, inputStream, inputStream.available(), ext); return sp.getFullPath(); } public Media savePicture(MultipartFile file, String ext, PictureZoomParameter zoomPar) throws Exception { ByteArrayOutputStream outs = new ByteArrayOutputStream(); Media media = new Media(); media.setType(ext); String path = null; if (zoomPar.getWidth1() != null && zoomPar.getWidth1() > 0) { path = this.thumbAndStorageOfFile(file, ext, zoomPar.getWidth1()); media.setUrl1(path); } if (zoomPar.getWidth2() != null && zoomPar.getWidth2() > 0) { path = this.thumbAndStorageOfFile(file, ext, zoomPar.getWidth2()); media.setUrl2(path); } if (zoomPar.getWidth3() != null && zoomPar.getWidth3() > 0) { path = this.thumbAndStorageOfFile(file, ext, zoomPar.getWidth3()); media.setUrl3(path); } // width4为原图 path = this.thumbAndStorageOfFile(file, ext, zoomPar.getWidth4()); media.setUrl4(path); return media; } /** * 保存视频文件 * * @param file * @param ext * @return * @throws Exception */ public Media saveVideo(MultipartFile file, String ext) throws Exception { // StorePath sp = storageClient.uploadFile(file.getInputStream(), file.getSize(), ext, null); StorePath sp = storageClient.uploadFile(groupName, file.getInputStream(), file.getSize(), ext); Media media = new Media(); media.setType(ext); media.setUrl1(sp.getFullPath()); return media; } /** * 删除一个文件 * * @param rootPath */ public void removeFile(String rootPath) { storageClient.deleteFile(rootPath); } public void removeMedia(Media media) { if (!StringUtils.isEmpty(media.getUrl1())) { storageClient.deleteFile(media.getUrl1()); } if (!StringUtils.isEmpty(media.getUrl2())) { storageClient.deleteFile(media.getUrl2()); } if (!StringUtils.isEmpty(media.getUrl3())) { storageClient.deleteFile(media.getUrl3()); } if (!StringUtils.isEmpty(media.getUrl4())) { storageClient.deleteFile(media.getUrl4()); } } public void removeMedias(List medias) { if (medias != null) { for (Media m : medias) { if (!StringUtils.isEmpty(m.getUrl1())) { storageClient.deleteFile(m.getUrl1()); } if (!StringUtils.isEmpty(m.getUrl2())) { storageClient.deleteFile(m.getUrl2()); } if (!StringUtils.isEmpty(m.getUrl3())) { storageClient.deleteFile(m.getUrl3()); } if (!StringUtils.isEmpty(m.getUrl4())) { storageClient.deleteFile(m.getUrl4()); } } } } /** * 判断文件是否存在 * * @param url * @return */ public Boolean isEmpty(String url) { return true; } /** * 缩放并且上传 * * @param in * @param ext * @param width * @return * @throws Exception */ private String thumbAndStorage(InputStream in, String ext, Integer width) throws Exception { Thumbnails.Builder fileBuilder = Thumbnails.of(in).scale(1.0).outputQuality(1.0); BufferedImage src = fileBuilder.asBufferedImage(); Integer w = src.getWidth(null); Integer destWidth = width > w ? w : width; ByteArrayOutputStream bouts = new ByteArrayOutputStream(); Thumbnails.of(in).width(destWidth).toOutputStream(bouts); InputStream ins = this.out2In(bouts); StorePath sp = storageClient.uploadFile(groupName, ins, bouts.size(), ext); // StorePath sp = storageClient.uploadFile(ins, bouts.size(), ext, null); bouts.close(); ins.close(); return sp.getFullPath(); } private String thumbAndStorageOfFile(MultipartFile file, String ext, Integer width) throws Exception { Thumbnails.Builder fileBuilder = Thumbnails.of(file.getInputStream()).scale(1.0).outputQuality(1.0); BufferedImage src = fileBuilder.asBufferedImage(); Integer w = src.getWidth(null); Integer destWidth = width == null || width > w ? w : width; ByteArrayOutputStream bouts = new ByteArrayOutputStream(); Thumbnails.of(file.getInputStream()).width(destWidth).toOutputStream(bouts); InputStream ins = this.out2In(bouts); StorePath sp = storageClient.uploadFile(groupName, ins, bouts.size(), ext); // StorePath sp = storageClient.uploadFile(ins, bouts.size(), ext, null); bouts.close(); ins.close(); return sp.getFullPath(); } /** * 输出流转输入流 * * @param outs * @return * @throws Exception */ private InputStream out2In(ByteArrayOutputStream outs) throws Exception { InputStream ins = new ByteArrayInputStream(outs.toByteArray()); return ins; } }