|
@@ -0,0 +1,260 @@
|
|
|
+package com.ruoyi.file.service;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.ruoyi.file.mapper.FilesMapper;
|
|
|
+import com.usky.common.security.utils.SecurityUtils;
|
|
|
+import com.usky.system.model.LoginUser;
|
|
|
+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.*;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class FilesServiceImpl extends ServiceImpl<FilesMapper, FilesUpload> implements FilesService {
|
|
|
+ @Value("${file.path}")
|
|
|
+ private String filesUploadPath;
|
|
|
+
|
|
|
+ @Value("${file.domain}")
|
|
|
+ private String filesUploadDomain;
|
|
|
+
|
|
|
+ @Value("${file.prefix}")
|
|
|
+ private String filesPrefix;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public FileUploadResponse upload(MultipartFile file) {
|
|
|
+
|
|
|
+
|
|
|
+ String userName = getUserNameFromSecurityContext();
|
|
|
+
|
|
|
+
|
|
|
+ String originalFilename = file.getOriginalFilename();
|
|
|
+
|
|
|
+
|
|
|
+ double size = file.getSize() / (1024.0);
|
|
|
+
|
|
|
+
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ String timestamp = now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
|
|
|
+
|
|
|
+
|
|
|
+ String type = originalFilename.substring(originalFilename.lastIndexOf(".") + 1).toLowerCase();
|
|
|
+
|
|
|
+
|
|
|
+ String yearMonth = now.format(DateTimeFormatter.ofPattern("yyyyMM"));
|
|
|
+
|
|
|
+ int monthIncrement = getMonthIncrement(yearMonth);
|
|
|
+
|
|
|
+ String fileUuid = timestamp + "A" + String.format("%04d", monthIncrement) + "." + type;
|
|
|
+
|
|
|
+
|
|
|
+ String destPath = filesUploadPath + "/" + yearMonth;
|
|
|
+
|
|
|
+
|
|
|
+ File uploadFile = new File(destPath + "/" + fileUuid);
|
|
|
+
|
|
|
+
|
|
|
+ File parentFile = uploadFile.getParentFile();
|
|
|
+ if (!parentFile.exists()) {
|
|
|
+ parentFile.mkdirs();
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+
|
|
|
+ file.transferTo(uploadFile);
|
|
|
+
|
|
|
+
|
|
|
+ String url = filesUploadDomain + filesPrefix + "/" + yearMonth + "/" + fileUuid;
|
|
|
+
|
|
|
+
|
|
|
+ FilesUpload saveFile = new FilesUpload();
|
|
|
+ saveFile.setFilesName(originalFilename);
|
|
|
+ saveFile.setName(fileUuid);
|
|
|
+ saveFile.setPath(destPath);
|
|
|
+ saveFile.setType(type);
|
|
|
+ saveFile.setSize(size);
|
|
|
+ saveFile.setUrl(url);
|
|
|
+ saveFile.setEnable(true);
|
|
|
+ saveFile.setIsDelete(0);
|
|
|
+ saveFile.setCreateBy(userName);
|
|
|
+ saveFile.setCreateTime(LocalDateTime.now());
|
|
|
+ saveFile.setUpdateBy(null);
|
|
|
+ saveFile.setUpdateTime(null);
|
|
|
+
|
|
|
+ save(saveFile);
|
|
|
+
|
|
|
+
|
|
|
+ return new FileUploadResponse(fileUuid, url);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ * 获取每月递增值
|
|
|
+ * @param yearMonth 年月(格式:yyyyMM)
|
|
|
+ * @return 递增值
|
|
|
+ */
|
|
|
+ private int getMonthIncrement(String yearMonth) {
|
|
|
+
|
|
|
+ String destPath = filesUploadPath + "/" + yearMonth;
|
|
|
+ File folder = new File(destPath);
|
|
|
+
|
|
|
+
|
|
|
+ if (!folder.exists()) {
|
|
|
+ folder.mkdirs();
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ File[] files = folder.listFiles();
|
|
|
+ if (files == null || files.length == 0) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return files.length + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void download(String filesUUID, HttpServletResponse response) {
|
|
|
+ try {
|
|
|
+
|
|
|
+
|
|
|
+ if ("favicon.ico".equals(filesUUID)) {
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ String fileName = filesUUID.substring(filesUUID.lastIndexOf('/') + 1);
|
|
|
+
|
|
|
+
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ String yearMonth = now.format(DateTimeFormatter.ofPattern("yyyyMM"));
|
|
|
+ File uploadFile = new File(filesUploadPath + "/" + yearMonth, fileName);
|
|
|
+
|
|
|
+
|
|
|
+ if (!uploadFile.exists()) {
|
|
|
+ throw new FileNotFoundException("File not found: " + uploadFile.getAbsolutePath());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
|
|
|
+ response.addHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
|
|
|
+ response.setContentType("application/octet-stream");
|
|
|
+
|
|
|
+
|
|
|
+ try (InputStream inputStream = new BufferedInputStream(new FileInputStream(uploadFile));
|
|
|
+ ServletOutputStream os = response.getOutputStream()) {
|
|
|
+
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
+ int length;
|
|
|
+ while ((length = inputStream.read(buffer)) != -1) {
|
|
|
+ os.write(buffer, 0, length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteFile(String filesUUID) {
|
|
|
+ try {
|
|
|
+
|
|
|
+
|
|
|
+ FilesUpload file = getOne(new QueryWrapper<FilesUpload>().eq("name", filesUUID));
|
|
|
+
|
|
|
+ if (file == null) {
|
|
|
+ throw new RuntimeException("文件不存在,无法删除");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ String filePath = file.getPath() + "/" + file.getName();
|
|
|
+ File localFile = new File(filePath);
|
|
|
+ if (localFile.exists()) {
|
|
|
+ if (!localFile.delete()) {
|
|
|
+ throw new RuntimeException("文件删除失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ FilesUpload updateFile = new FilesUpload();
|
|
|
+ updateFile.setId(file.getId());
|
|
|
+ updateFile.setFilesName(file.getFilesName());
|
|
|
+ updateFile.setName(file.getName());
|
|
|
+ updateFile.setPath(file.getPath());
|
|
|
+ updateFile.setType(file.getType());
|
|
|
+ updateFile.setSize(file.getSize());
|
|
|
+ updateFile.setUrl(file.getUrl());
|
|
|
+ updateFile.setEnable(false);
|
|
|
+ updateFile.setIsDelete(1);
|
|
|
+ updateFile.setCreateBy(file.getCreateBy());
|
|
|
+ updateFile.setCreateTime(file.getCreateTime());
|
|
|
+ updateFile.setUpdateBy(file.getUpdateBy());
|
|
|
+ updateFile.setUpdateTime(LocalDateTime.now());
|
|
|
+
|
|
|
+
|
|
|
+ updateById(updateFile);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException("删除文件失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<FilesUpload> queryFiles(String filesName, LocalDateTime startTime, LocalDateTime endTime, Boolean isDeleted, String fileType, Page<FilesUpload> page) {
|
|
|
+ QueryWrapper<FilesUpload> queryWrapper = new QueryWrapper<>();
|
|
|
+
|
|
|
+
|
|
|
+ if (isDeleted == null) {
|
|
|
+ queryWrapper.eq("is_delete", 0);
|
|
|
+ } else {
|
|
|
+ queryWrapper.eq("is_delete", isDeleted ? 1 : 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (filesName != null && !filesName.isEmpty()) {
|
|
|
+ queryWrapper.like("files_name", filesName);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (startTime != null && endTime != null) {
|
|
|
+ queryWrapper.ge("create_time", startTime);
|
|
|
+ queryWrapper.le("create_time", endTime);
|
|
|
+ } else if (startTime != null) {
|
|
|
+ queryWrapper.ge("create_time", startTime);
|
|
|
+ } else if (endTime != null) {
|
|
|
+ queryWrapper.le("create_time", endTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fileType != null && !fileType.isEmpty()) {
|
|
|
+ queryWrapper.eq("type", fileType);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ queryWrapper.orderByDesc("create_time");
|
|
|
+
|
|
|
+ return page(page, queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getUserNameFromSecurityContext() {
|
|
|
+ try {
|
|
|
+ return SecurityUtils.getUsername();
|
|
|
+ } catch (Exception e) {
|
|
|
+
|
|
|
+ return "未知用户";
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|