package com.kidgrow.filecenter.service.impl; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.kidgrow.common.constant.CommonConstant; import com.kidgrow.common.model.PageResult; import com.kidgrow.common.utils.DateUtil; import com.kidgrow.common.utils.MultipartFileUtils; import com.kidgrow.common.utils.RandomValueUtils; import com.kidgrow.common.utils.StringUtils; import com.kidgrow.filecenter.mapper.FileMapper; import com.kidgrow.filecenter.model.FileInfo; import com.kidgrow.filecenter.service.IFileService; import com.kidgrow.filecenter.util.FileUtil; import lombok.extern.slf4j.Slf4j; import net.coobird.thumbnailator.Thumbnails; import org.apache.commons.collections4.MapUtils; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Date; import java.util.List; import java.util.Map; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description:
* @Project:
* @CreateDate: Created in 2020/2/18 11:24
* @Author: liuke */ @Slf4j public abstract class AbstractIFileService extends ServiceImpl implements IFileService { private static final String FILE_SPLIT = "."; @Override public FileInfo upload(MultipartFile file) throws Exception { FileInfo fileInfo = FileUtil.getFileInfo(file); FileInfo oldFileInfo = baseMapper.selectById(fileInfo.getId()); if (oldFileInfo != null) { return oldFileInfo; } if (!fileInfo.getName().contains(FILE_SPLIT)) { throw new IllegalArgumentException("缺少后缀名"); } uploadFile(file, fileInfo); // 设置文件来源 fileInfo.setSource(fileType()); // 将文件信息保存到数据库 baseMapper.insert(fileInfo); return fileInfo; } @Override public FileInfo upload(MultipartFile file,String imgType) throws Exception { FileInfo fileInfo = FileUtil.getFileInfo(file); FileInfo oldFileInfo = baseMapper.selectById(fileInfo.getId()); if (oldFileInfo != null) { return oldFileInfo; } if (!fileInfo.getName().contains(FILE_SPLIT)) { throw new IllegalArgumentException("缺少后缀名"); } fileInfo.setImgType(imgType); // X光片或者Logo uploadFile(file, fileInfo); // 设置文件来源 fileInfo.setSource(fileType()); // 将文件信息保存到数据库 baseMapper.insert(fileInfo); return fileInfo; } /** * 文件来源 * * @return */ protected abstract String fileType(); /** * 上传文件 * * @param file * @param fileInfo */ protected abstract void uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception; protected abstract void fileUpLoadOss(FileInfo fileInfo,String newFilePath, InputStream fileStream); protected abstract String FilePath(String imgType,String folderByDate); /** * 删除文件 * @param id 文件id */ @Override public void delete(String id) { FileInfo fileInfo = baseMapper.selectById(id); if (fileInfo != null) { baseMapper.deleteById(fileInfo.getId()); this.deleteFile(fileInfo); } } /** * 删除文件资源 * * @param fileInfo * @return */ protected abstract boolean deleteFile(FileInfo fileInfo); @Override public PageResult findList(Map params) { Page page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit")); List list = baseMapper.findList(page, params); return PageResult.builder().data(list).code(0).count(page.getTotal()).build(); } /** * 上传图片-并缩略,其实是给文件服务器存储了两个文件 一个原文件 一个缩略图文件 * @param file form内的文件数据 * @param imgType 业务类型 例如logo * @return 返回的实体中 path字段保存的是缩略图地址 * @throws Exception */ @Override public FileInfo uploadForThumbnails(MultipartFile file, String imgType) throws Exception { FileInfo fileInfo=this.upload(file,imgType); if (StringUtils.isNotBlank(fileInfo.getUrl())) { //生成缩略图上传 File nowFile= MultipartFileUtils.multipartFileToFile(file); //暂存目录 发布后真实存在的磁盘目录 String result = CommonConstant.TEMP_IMAGE_PATH; //文件扩展名 String suffix=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); String newFileName= RandomValueUtils.uuid()+suffix; //生成缩略图 Thumbnails.of(nowFile).size(CommonConstant.TH_IMG_WIDTH, CommonConstant.TH_IMG_HEIGHT).toFile(result+newFileName); File thuFile= new File(result+newFileName); if (thuFile.exists()) { //将生成的文件转换为流 InputStream inputStream=new FileInputStream(new File(result+newFileName)); String folderByDate = DateUtil.formatDate(new Date()); String filefloder=this.FilePath(imgType,folderByDate); FileInfo newfileInfo=new FileInfo(); newfileInfo.setName(newFileName); newfileInfo.setId(IdUtil.fastSimpleUUID()); newfileInfo.setSize(thuFile.length()); newfileInfo.setIsImg(true); newfileInfo.setContentType(file.getContentType()); newfileInfo.setSource(fileInfo.getSource()); newfileInfo.setImgType(imgType); newfileInfo.setCreateTime(new Date()); //文件上传到oss this.fileUpLoadOss(newfileInfo,filefloder+newFileName,inputStream); // 将文件信息保存到数据库 baseMapper.insert(newfileInfo); fileInfo.setPath(newfileInfo.getUrl()); //删除暂存文件 MultipartFileUtils.delteTempFile(thuFile); inputStream.close(); } return fileInfo; } else { return fileInfo; } } }