package com.sandu.common.file.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.io.FileTypeUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.UUID; import com.sandu.common.enums.FileStorageEnums; import com.sandu.common.execption.BusinessException; import com.sandu.common.file.*; import com.sandu.common.file.config.FileProperties; import com.sandu.common.util.SpringContextHolder; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.math.BigInteger; import java.security.MessageDigest; import java.time.LocalDate; import java.util.List; import java.util.Optional; /** * @author chenjiantian 本地服务器上传 */ @Slf4j @Service @AllArgsConstructor public class LocalFileUploadImpl implements IFileUpload { private static List videoSuffixList = CollectionUtil.newArrayList("mp4", "mov", "avi", "mkv", "m4v", "wmv", "asf", "asx", "rm", "rmvb", "3gp", "dat", "flv", "vob"); private final FileToThumbnail fileToThumbnail; @Override public FileUploadDto uploadFile(MultipartFile multipartFile) { FileProperties fileProperties = SpringContextHolder.getBean(FileProperties.class); String originalFilename = multipartFile.getOriginalFilename(); long size = multipartFile.getSize(); String suffix = FileUtil.getSuffix(originalFilename); String date = LocalDateTimeUtil.formatNormal(LocalDate.now()); String uuidStr = UUID.fastUUID().toString(); String fileName = uuidStr + "." + suffix; File dest; try { String type = Optional.ofNullable(FileTypeUtil.getType(multipartFile.getInputStream(), originalFilename)).orElse(""); dest = new File(fileProperties.getUploadRootPath() + type + File.separator + date + File.separator + fileName).getCanonicalFile(); if (!dest.getParentFile().exists()) { dest.getParentFile().mkdirs(); } multipartFile.transferTo(dest); } catch (Exception e) { e.printStackTrace(); throw new BusinessException(e.getMessage()); } FileUploadDto uploadDto = new FileUploadDto(); uploadDto.setOriginName(originalFilename); uploadDto.setFileName(fileName); uploadDto.setRealUrl(dest.getPath()); uploadDto.setFileUrl(fileProperties.getRealUrl() + dest.getPath()); uploadDto.setFileType(FileUtil.getType(dest)); uploadDto.setStorageType(FileStorageEnums.LOCAL.getCode()); uploadDto.setFileSize(size); uploadDto.setMd5(getMD5(multipartFile) + "." + uploadDto.getFileType()); if (IMAGE_SUFFIX_LIST.contains(uploadDto.getFileType())) { BufferedImage img = null; try { img = ImageIO.read(dest); } catch (IOException e) { e.printStackTrace(); } if (img != null && img.getWidth() >= 0 && img.getHeight() >= 0) { uploadDto.setWidth(img.getWidth()); uploadDto.setHeight(img.getHeight()); } } else if (FileService.videoSuffixList.contains(uploadDto.getFileType())) { try { long duration = VideoUtil.getDuration(uploadDto.getRealUrl()); uploadDto.setDuration((int) (duration * 1000)); } catch (IOException e) { throw new RuntimeException(e); } try { InputStream inputStream = multipartFile.getInputStream(); String screenShot = fileProperties.getUploadRootPath() + uploadDto.getFileType() + File.separator + date + File.separator + "screenShot" + uuidStr + ".jpg"; String thumbnailForVideo = fileToThumbnail.getThumbnailForVideo(inputStream, screenShot); uploadDto.setScreenShot(fileProperties.getRealUrl() + thumbnailForVideo); inputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } return uploadDto; } /** * 获取上传文件的MD5值 * * @param file * @return */ public String getMD5(MultipartFile file) { try { byte[] uploadBytes = file.getBytes(); MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] digest = md5.digest(uploadBytes); String hashString = new BigInteger(1, digest).toString(16); if (hashString.length() % 2 != 0) { hashString = "0" + hashString; } return hashString; } catch (Exception e) { } return null; } }