package com.ruoyi.personnel.service.impl; import cn.hutool.core.lang.UUID; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.personnel.enumeration.AttachmentType; import com.ruoyi.personnel.mapper.PersonTrainingFileMapper; import com.ruoyi.personnel.pojo.PersonTrainingFile; import com.ruoyi.personnel.service.FileGeneralService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.time.LocalDateTime; import java.util.List; @Service public class FileGeneralServiceImpl implements FileGeneralService { @Autowired private PersonTrainingFileMapper fileMapper; @Value("${wordUrl}") private String wordUrl; @Value("${file.path}") private String imgUrl; @Value("${excelUrl}") private String excelUrl; @Override public void fileUpload(MultipartFile file, String suffix, Integer id,Integer type) { String name = file.getOriginalFilename(); UUID uuid = UUID.randomUUID(); String fileName = uuid + name; String path = ""; // 根据后缀判断属于什么类型 if(suffix.toLowerCase().contains("xls")) { path = excelUrl; } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) { path = wordUrl; } else { path = imgUrl; } File file1 = new File(path); if(!file1.exists()) { file1.mkdir(); } try { File file2 = new File(file1, fileName); file.transferTo(file2); // 保存数据库 PersonTrainingFile personTrainingFile = new PersonTrainingFile(); personTrainingFile.setDetailId(id); personTrainingFile.setFileUrl("/" + fileName); personTrainingFile.setFileName(file.getOriginalFilename()); personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue()); personTrainingFile.setCreateTime(LocalDateTime.now()); personTrainingFile.setEnumAttachmentType(AttachmentType.getTypeValue(type)); fileMapper.insert(personTrainingFile); } catch (IOException e) { throw new RuntimeException(e); } } @Override public List selectFile(Integer id, Integer type) { List personTrainingFileList = fileMapper.selectList(new LambdaQueryWrapper() .eq(PersonTrainingFile::getDetailId, id) .eq(PersonTrainingFile::getEnumAttachmentType, AttachmentType.getTypeValue(type))); if(CollectionUtils.isNotEmpty(personTrainingFileList)) { for(PersonTrainingFile a : personTrainingFileList) { // 设置mime int i = a.getFileUrl().lastIndexOf("."); String contentType = getContentType(a.getFileUrl().substring(i + 1)); a.setMime(contentType); } } return personTrainingFileList; } @Override public void delFile(Integer id) { fileMapper.deleteById(id); } @Override public void fileDownLoad(Integer id, HttpServletResponse response) { PersonTrainingFile personTrainingFile = fileMapper.selectById(id); // 获取文件后缀 String suffix = personTrainingFile.getFileName().substring(personTrainingFile.getFileName().lastIndexOf(".") + 1); String path = ""; if(suffix.toLowerCase().contains("xls")) { path = excelUrl; } else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) { path = wordUrl; } else { path = imgUrl; } File file = new File(path + File.separator + personTrainingFile.getFileUrl()); if(!file.exists()) { throw new RuntimeException("文件不存在"); } try(FileInputStream fileInputStream = new FileInputStream(file); ServletOutputStream stream = response.getOutputStream()) { String contentType = getContentType(suffix); response.setContentType(contentType); response.setHeader("Content-disposition", "attachment;filename=" + personTrainingFile.getFileName()); byte[] bytes = new byte[1024]; int i; while((i = fileInputStream.read(bytes)) != -1) { stream.write(bytes, 0, i); stream.flush(); } }catch (Exception e) { throw new RuntimeException(e); } } // 根据文件扩展名获取 MIME 类型 private String getContentType(String fileExtension) { switch (fileExtension) { case "jpg": case "jpeg": return "image/jpeg"; case "png": return "image/png"; case "gif": return "image/gif"; case "pdf": return "application/pdf"; case "doc": return "application/msword"; case "docx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; case "xls": return "application/vnd.ms-excel"; case "xlsx": return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; case "ppt": case "pptx": return "application/vnd.ms-powerpoint"; default: return "application/octet-stream"; // 默认二进制流 } } }