From 346288bc38bdab442721d7609caed86d03b9d2d4 Mon Sep 17 00:00:00 2001 From: cjl <276999030@qq.com> Date: Tue, 26 Sep 2023 19:25:24 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/wb' into qa --- screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 238 insertions(+), 0 deletions(-) diff --git a/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java new file mode 100644 index 0000000..1fdde7a --- /dev/null +++ b/screen-api/src/main/java/com/moral/api/service/impl/FileTableServiceImpl.java @@ -0,0 +1,238 @@ +package com.moral.api.service.impl; + +import com.moral.api.config.Interceptor.UserHelper; +import com.moral.api.entity.FileTable; +import com.moral.api.exception.BusinessException; +import com.moral.api.mapper.FileTableMapper; +import com.moral.api.pojo.enums.FileType; +import com.moral.api.pojo.enums.YesOrNo; +import com.moral.api.pojo.vo.file.FileVo; +import com.moral.api.pojo.vo.user.QxUser; +import com.moral.api.service.FileTableService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.moral.api.utils.FileTypeUtils; +import com.moral.api.utils.StringUtils; +import com.moral.util.DateUtils; +import lombok.extern.slf4j.Slf4j; +import net.coobird.thumbnailator.Thumbnails; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; +import java.util.stream.Collectors; + +/** + * <p> + * ��������� ��������������� + * </p> + * + * @author moral + * @since 2023-09-21 + */ +@Service +@Slf4j +public class FileTableServiceImpl extends ServiceImpl<FileTableMapper, FileTable> implements FileTableService { + @Value("${file.path}") + private String basePath; + @Override + public FileVo upload(MultipartFile file, Integer sysCode) { + String originalFilename = file.getOriginalFilename().replaceAll(StringUtils.SPACE, StringUtils.EMPTY).toLowerCase(); + String suffix = originalFilename.substring(originalFilename.lastIndexOf(StringUtils.DOT)); + FileType fileType = FileTypeUtils.getFileType(suffix.toLowerCase()); + // ������������������������ ������������ + ������������ + ������ + String filePath = getFilePath(sysCode.toString()); + // ������������ + String targetFolder = basePath.replaceAll(StringUtils.BACKSLASH.concat(StringUtils.BACKSLASH), StringUtils.SLASH).concat(StringUtils.SLASH).concat(filePath); + //������uuid ������������������������������������ + String storageFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf(StringUtils.DOT)); + storageFile(file, storageFileName, targetFolder); + + // ������������������ + QxUser user = UserHelper.getCurrentUser(); + FileTable sysFile = new FileTable(); + sysFile.setFileName(originalFilename).setFileType(fileType.getValue()).setFileSize((int) file.getSize()).setFileAddress(filePath.concat(storageFileName)) + .setFileModule(sysCode).setCreateTime(new Date()); + if (Objects.nonNull(user)) { + sysFile.setCreateId(user.getUserId()).setCreateName(user.getUserName()); + } + save(sysFile); + return new FileVo().setFileId(sysFile.getFileId()).setFileName(originalFilename).setFileType(fileType.getValue()); + } + + @Override + public List<FileVo> upload(List<MultipartFile> files, Integer sysCode) { + List<FileVo> fileList = new LinkedList<>(); + for (MultipartFile file : files) { + fileList.add(upload(file, sysCode)); + } + return fileList; + } + + @Override + public void preview(Integer id, HttpServletRequest request, HttpServletResponse response) { + FileTable sysFile = getById(id); + File file = new File(handleFileRealPath(sysFile.getFileAddress())); + String suffix = file.getName().substring(file.getName().lastIndexOf(StringUtils.DOT)); + if (FileTypeUtils.SUFFIX_MP4.equals(suffix)) { + videoPreview(file, request, response); + } else { + try (OutputStream out = response.getOutputStream(); InputStream in = new FileInputStream(file)) { + response.setContentType(FileTypeUtils.convertHeaderType(suffix)); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(sysFile.getFileName(), "UTF-8")); + int len; + // ��������������������� + byte[] buffer = new byte[1024]; + while ((len = in.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + } catch (Exception e) { + log.error("������������������!!! e={}", e.getMessage()); + } + } + } + + private String getFilePath(String sysCode) { + return sysCode.concat(StringUtils.SLASH).concat(StringUtils.SLASH).concat(DateUtils.dateToDateString(new Date(),DateUtils.yyyyMMdd_EN)).concat(StringUtils.SLASH); + } + + public void storageFile(MultipartFile file, String originalFilename, String targetFolder) { + File f = new File(targetFolder, originalFilename); + try { + // ������������ + if (!f.getParentFile().exists()) { + if (!f.getParentFile().mkdirs()) { + log.error("error:������������������! dir={}", f.getAbsolutePath()); + } + } + file.transferTo(f); + } catch (IOException e) { + log.error("error:������������������!!!e={}", e.getMessage()); + throw new BusinessException("������������������������������!"); + } + } + private String handleFileRealPath(String path) { + return basePath.replaceAll(StringUtils.BACKSLASH.concat(StringUtils.BACKSLASH), StringUtils.SLASH).concat(StringUtils.SLASH).concat(path); + } + private void videoPreview(File file, HttpServletRequest request, HttpServletResponse response) { + String suffix = file.getName().substring(file.getName().lastIndexOf(StringUtils.DOT)); + //������������ + response.setContentType(FileTypeUtils.convertHeaderType(suffix)); + response.setHeader("Accept-Ranges", "bytes"); + response.setHeader("ETag", file.getName()); + response.setHeader("Last-Modified", new Date().toString()); + long contentLength = file.length(); + + //��������������������������������������������������������������� + long length = Math.min(contentLength, 1024); + long start = 0, end = 0; + String range = request.getHeader("Range"); + //������������������������content length��������������������������������������� + if (range == null) { + response.setHeader("Content-length", contentLength + ""); + } else { + //������������������������������������������������������������ + response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);//206 + + if (range.startsWith("bytes=")) { + String[] values = range.split("=")[1].split("-"); + start = Integer.parseInt(values[0]); + if (values.length > 1) { + end = Integer.parseInt(values[1]); + } + } + //���end,��������������������������� + long maxSize = 1024 * 1024; //1MB + if (end > 0) { + length = end - start + 1; + response.setHeader("Content-length", "" + length); + response.setHeader("Content-Range", "bytes " + start + "-" + end + "/" + contentLength); + } else { + length = Math.min((contentLength - start), maxSize); + response.setHeader("Content-length", "" + length); + response.setHeader("Content-Range", "bytes " + start + "-" + (start + length - 1) + "/" + contentLength); + } + } + try { + FileInputStream fileInputStream = new FileInputStream(file); + OutputStream out = response.getOutputStream(); + //������������������������byte[]��������� + byte[] data = new byte[(int) length]; + fileInputStream.skip(start); + fileInputStream.read(data); + //������������������������������������ + out.write(data); + out.close(); + fileInputStream.close(); + } catch (Exception e) { + log.error("������������������!!! e={}", e.getMessage()); + } + } + @Override + public void coverPreview(Integer id, HttpServletRequest request, HttpServletResponse response) { + FileTable sysFile = getById(id); + + File file = new File(handleFileRealPath(sysFile.getFileAddress())); + String suffix = file.getName().substring(file.getName().lastIndexOf(StringUtils.DOT)); + + try (OutputStream out = response.getOutputStream()) { + response.setContentType(FileTypeUtils.convertHeaderType(suffix)); + response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(sysFile.getFileName(), "UTF-8")); + Thumbnails.of(file).size(420, 200).toOutputStream(out); + } catch (Exception e) { + log.error("������������������!!! e={}", e.getMessage()); + } + } + + @Override + @Transactional + public void upDateResult(List<FileVo> list,int relationId,int fileModule) { + List<FileTable> existsList = this.lambdaQuery().eq(FileTable::getRelationId, relationId) + .eq(FileTable::getFileModule, fileModule) + .eq(FileTable::getIsDel, YesOrNo.NO.value).list(); + + // ������������ + if (!CollectionUtils.isEmpty(list)) { + List<FileTable> addList = new ArrayList(); + // 2.2.������������������������������ + list.forEach(it -> { + existsList.removeIf(file -> file.getFileId().equals(it.getFileId())); + FileTable file = new FileTable(); + BeanUtils.copyProperties(it,file); + file.setRelationId(relationId); + addList.add(file); + }); + if (!CollectionUtils.isEmpty(addList)) { + // ������ + this.updateBatchById(addList); + } + } + // ������������ + if (!CollectionUtils.isEmpty(existsList)) { + removeByIds(existsList.stream().map(FileTable::getFileId).collect(Collectors.toList())); + } + } + + @Override + public List<FileVo> list(int relationId, int fileModule) { + List<FileVo> list = new ArrayList<>(); + List<FileTable> existsList = this.lambdaQuery().eq(FileTable::getRelationId, relationId) + .eq(FileTable::getFileModule, fileModule) + .eq(FileTable::getIsDel, YesOrNo.NO.value).orderByAsc(FileTable::getCreateTime).list(); + existsList.forEach(it->{ + FileVo fileVo = new FileVo(); + fileVo.setFileId(it.getFileId()); + fileVo.setFileName(it.getFileName()); + fileVo.setFileType(it.getFileType()); + list.add(fileVo); + }); + return list; + } +} -- Gitblit v1.8.0