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<Media> 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;
|
}
|
|
|
}
|