diff --git a/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java b/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java index 17e22d98..ca82016c 100644 --- a/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java +++ b/das/src/main/java/com/das/modules/fdr/controller/FaultRecorderController.java @@ -5,7 +5,9 @@ import com.alibaba.fastjson.JSONObject; import com.das.common.result.R; import com.das.modules.equipment.entity.SysEquipment; import com.das.modules.fdr.domain.FileNode; +import com.das.modules.fdr.domain.dto.FileDownloadDto; import com.das.modules.fdr.service.FaultRecorderService; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -45,4 +47,10 @@ public class FaultRecorderController { faultRecorderService.updateFdrConfig(sysEquipment); } + + @RequestMapping(value = "/download", method = RequestMethod.POST) + public void downloadFdrFile(@RequestBody FileDownloadDto fileDownloadDto, HttpServletResponse httpServletResponse) throws IOException { + + faultRecorderService.download(fileDownloadDto.getUrl(),httpServletResponse); + } } diff --git a/das/src/main/java/com/das/modules/fdr/domain/dto/FileDownloadDto.java b/das/src/main/java/com/das/modules/fdr/domain/dto/FileDownloadDto.java new file mode 100644 index 00000000..5860dbf2 --- /dev/null +++ b/das/src/main/java/com/das/modules/fdr/domain/dto/FileDownloadDto.java @@ -0,0 +1,13 @@ +package com.das.modules.fdr.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FileDownloadDto { + + private String url; +} diff --git a/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java b/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java index 2add8e12..70a2377d 100644 --- a/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java +++ b/das/src/main/java/com/das/modules/fdr/service/FaultRecorderService.java @@ -2,6 +2,7 @@ package com.das.modules.fdr.service; import com.das.modules.equipment.entity.SysEquipment; import com.das.modules.fdr.domain.FileNode; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -13,6 +14,8 @@ import java.util.Map; public interface FaultRecorderService { List getDirOrFileList(String name,String startTime, String endTime); + void download(String path, HttpServletResponse httpServletResponse) throws IOException; + Map> getDataCurve(String url, String deviceCode) throws IOException; void updateFdrConfig(SysEquipment sysEquipment); @@ -20,9 +23,4 @@ public interface FaultRecorderService { String upload(String parent, String folderName, MultipartFile file); void readFileToSteam(String path, OutputStream stream); - - void download(String path, Path tempDir); - - - } diff --git a/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java b/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java index 7a5a698c..f42ef18c 100644 --- a/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java +++ b/das/src/main/java/com/das/modules/fdr/service/MinioViewsServcie.java @@ -8,6 +8,7 @@ import io.micrometer.common.util.StringUtils; import io.minio.*; import io.minio.errors.*; import io.minio.messages.Item; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -185,22 +186,60 @@ public class MinioViewsServcie { } } - public void download(String path, Path tempDir) { + public void download(String path, Path tempDir,HttpServletResponse httpServletResponse) { + File tempFile = null; try (InputStream inputStream = minioClient.getObject(GetObjectArgs.builder() .bucket(minioProperties.getBucket()) .object(path) .build())) { // 保存到临时文件夹 - File tempFile = tempDir.resolve(tempDir+path).toFile(); - FileUtil.writeFromStream(inputStream,tempFile); - } - catch (Exception ignored){ + tempFile = tempDir.resolve(tempDir + path).toFile(); + FileUtil.writeFromStream(inputStream, tempFile); + writeFileToRes(tempFile, httpServletResponse); + } catch (Exception ignored) { + } finally { + assert tempFile != null; + if (tempFile.exists()){ + tempFile.delete(); + } } } + + public void writeFileToRes(File downloadFile, HttpServletResponse response) throws IOException { + // 检查文件是否存在 + if (!downloadFile.exists()) { + response.sendError(HttpServletResponse.SC_NOT_FOUND); + return; + } + + // 获取文件名 + String fileName = downloadFile.getName(); + + fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); + + // 设置响应头 + response.setContentType("application/octet-stream"); + response.setContentLength((int) downloadFile.length()); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); + + // 读取文件并写入响应的输出流 + try (FileInputStream inStream = new FileInputStream(downloadFile); + OutputStream outStream = response.getOutputStream()) { + + byte[] buffer = new byte[4096]; + int bytesRead = -1; + + while ((bytesRead = inStream.read(buffer)) != -1) { + outStream.write(buffer, 0, bytesRead); + } + } + } + + // 递归方式 计算文件的大小 public long getTotalSizeOfFilesInDir(File file) { if (file.isFile()) { @@ -229,4 +268,5 @@ public class MinioViewsServcie { return inputStream; } + } diff --git a/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java b/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java index 6c980999..e621cce0 100644 --- a/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java +++ b/das/src/main/java/com/das/modules/fdr/service/impl/FaultRecorderServiceImpl.java @@ -1,7 +1,6 @@ package com.das.modules.fdr.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.das.common.constant.FileConstants; import com.das.common.exceptions.ServiceException; @@ -12,17 +11,16 @@ import com.das.modules.fdr.domain.FileNode; import com.das.modules.fdr.domain.vo.FdrFormatVo; import com.das.modules.fdr.service.FaultRecorderService; import com.das.modules.fdr.service.MinioViewsServcie; -import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.common.util.StringUtils; -import io.minio.GetObjectArgs; import io.minio.MinioClient; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.*; +import java.nio.file.Files; import java.nio.file.Path; import java.rmi.ServerException; import java.text.ParseException; @@ -30,7 +28,6 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.stream.Collectors; @Service @Slf4j @@ -75,8 +72,9 @@ public class FaultRecorderServiceImpl implements FaultRecorderService { } @Override - public void download(String path, Path tempDir) { - minioViewsServcie.download(path, tempDir); + public void download(String path,HttpServletResponse httpServletResponse) throws IOException { + Path tempDir = Files.createTempDirectory(null); + minioViewsServcie.download(path, tempDir,httpServletResponse); } @@ -188,6 +186,8 @@ public class FaultRecorderServiceImpl implements FaultRecorderService { return map; } + + public long convertToTimestamp(String time, String pattern) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat(pattern); return sdf.parse(time).getTime();