10 changed files with 455 additions and 167 deletions
-
5pom.xml
-
15src/main/java/a8k/a8kproj/optalgo/type/A8kOptPeak.java
-
5src/main/java/a8k/constant/FilePathConstant.java
-
56src/main/java/a8k/controler/filemgr/FileMgrControler.java
-
153src/main/java/a8k/controler/filemgr/FileMgrController.java
-
32src/main/java/a8k/extapi_controler/DownloadMgr.java
-
192src/main/java/a8k/service/app/appdata/FileMgrService.java
-
98src/main/java/a8k/service/test/A8kOptTest.java
-
41src/main/resources/static/filemgr/index.html
-
23src/main/resources/templates/filemgr/index.html
@ -1,6 +1,7 @@ |
|||
package a8k.constant; |
|||
|
|||
public class FilePathConstant { |
|||
public static final String FILE_UPLOAD_PATH = "runenv/files/"; |
|||
public static final String FILE_DOWNLOAD_PATH = "runenv/files/"; |
|||
public static final String FILE_UPLOAD_PATH = "runenv/files"; |
|||
public static final String FILE_OPT_REPORT_PATH = "runenv/files/optReport"; |
|||
public static final String FILE_DOWNLOAD_PATH = "runenv/files"; |
|||
} |
@ -1,56 +0,0 @@ |
|||
package a8k.controler.filemgr; |
|||
|
|||
|
|||
import a8k.constant.FilePathConstant; |
|||
import a8k.type.appret.ApiV1Ret; |
|||
import io.swagger.v3.oas.annotations.tags.Tag; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.core.io.FileSystemResource; |
|||
import org.springframework.core.io.Resource; |
|||
import org.springframework.http.ContentDisposition; |
|||
import org.springframework.http.HttpHeaders; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.web.bind.annotation.*; |
|||
import org.springframework.web.multipart.MultipartFile; |
|||
|
|||
import java.io.File; |
|||
import java.io.IOException; |
|||
|
|||
@Tag(name = "文件管理") |
|||
@Slf4j |
|||
@RestController |
|||
@RequestMapping(value = "/filemgr") |
|||
public class FileMgrControler { |
|||
|
|||
|
|||
@GetMapping("/download/{path}") |
|||
public ResponseEntity<Resource> download(@PathVariable String path) { |
|||
String realpath = String.format(FilePathConstant.FILE_DOWNLOAD_PATH + "/%s", path); |
|||
String contentDisposition = ContentDisposition |
|||
.builder("attachment") |
|||
.filename(path) // Use the original filename |
|||
.build().toString(); |
|||
return ResponseEntity.ok() |
|||
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) |
|||
.body(new FileSystemResource(realpath)); |
|||
} |
|||
|
|||
|
|||
@PostMapping("/upload") |
|||
public String handleFileUpload(@RequestParam("file") MultipartFile file) { |
|||
String uploadDir = FilePathConstant.FILE_UPLOAD_PATH; |
|||
File updatefilepath = new File(uploadDir); |
|||
if (!updatefilepath.exists()) { |
|||
updatefilepath.mkdirs(); |
|||
} |
|||
|
|||
try { |
|||
file.transferTo(new File(updatefilepath.getAbsolutePath() + file.getOriginalFilename())); |
|||
return "success"; |
|||
} catch (IOException e) { |
|||
return "fail"; |
|||
} |
|||
} |
|||
|
|||
} |
@ -0,0 +1,153 @@ |
|||
//package a8k.controler.filemgr; |
|||
// |
|||
// |
|||
//import a8k.constant.FilePathConstant; |
|||
//import a8k.type.appret.ApiV1Ret; |
|||
//import io.swagger.v3.oas.annotations.tags.Tag; |
|||
//import lombok.extern.slf4j.Slf4j; |
|||
//import org.springframework.core.io.FileSystemResource; |
|||
//import org.springframework.core.io.Resource; |
|||
//import org.springframework.http.ContentDisposition; |
|||
//import org.springframework.http.HttpHeaders; |
|||
//import org.springframework.http.ResponseEntity; |
|||
//import org.springframework.stereotype.Controller; |
|||
//import org.springframework.web.bind.annotation.*; |
|||
//import org.springframework.web.multipart.MultipartFile; |
|||
// |
|||
//import java.io.File; |
|||
//import java.io.IOException; |
|||
// |
|||
//@Tag(name = "文件管理") |
|||
//@Slf4j |
|||
//@Controller |
|||
//@RequestMapping(value = "/files") |
|||
//public class FileMgrControler { |
|||
// |
|||
// @GetMapping("") |
|||
// public String index() { |
|||
// log.info("======================================================================================="); |
|||
// return "files/index.html"; |
|||
// } |
|||
// |
|||
// @GetMapping("/download/{path}") |
|||
// @ResponseBody |
|||
// public ResponseEntity<Resource> download(@PathVariable String path) { |
|||
// String realpath = String.format(FilePathConstant.FILE_DOWNLOAD_PATH + "/%s", path); |
|||
// String contentDisposition = ContentDisposition |
|||
// .builder("attachment") |
|||
// .filename(path) // Use the original filename |
|||
// .build().toString(); |
|||
// return ResponseEntity.ok() |
|||
// .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) |
|||
// .body(new FileSystemResource(realpath)); |
|||
// } |
|||
// |
|||
// |
|||
// @PostMapping("/upload") |
|||
// @ResponseBody |
|||
// public String handleFileUpload(@RequestParam("file") MultipartFile file) { |
|||
// String uploadDir = FilePathConstant.FILE_UPLOAD_PATH; |
|||
// File updatefilepath = new File(uploadDir); |
|||
// if (!updatefilepath.exists()) { |
|||
// updatefilepath.mkdirs(); |
|||
// } |
|||
// |
|||
// try { |
|||
// file.transferTo(new File(updatefilepath.getAbsolutePath() + file.getOriginalFilename())); |
|||
// return "success"; |
|||
// } catch (IOException e) { |
|||
// return "fail"; |
|||
// } |
|||
// } |
|||
// |
|||
//} |
|||
// src/main/java/a8k/controller/FileMgrController.java |
|||
package a8k.controler.filemgr; |
|||
|
|||
import a8k.constant.FilePathConstant; |
|||
import jakarta.servlet.http.HttpServletRequest; |
|||
import lombok.Getter; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.core.io.FileSystemResource; |
|||
import org.springframework.core.io.Resource; |
|||
import org.springframework.core.io.UrlResource; |
|||
import org.springframework.http.ContentDisposition; |
|||
import org.springframework.http.HttpHeaders; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.ui.Model; |
|||
import org.springframework.web.bind.annotation.*; |
|||
import org.springframework.web.multipart.MultipartFile; |
|||
|
|||
import java.io.File; |
|||
import java.nio.file.Path; |
|||
import java.nio.file.Paths; |
|||
import java.util.List; |
|||
|
|||
@Controller |
|||
@Slf4j |
|||
@RequestMapping("/filemgr") |
|||
public class FileMgrController { |
|||
|
|||
record FileGroup(String name, List<FileInfo> files) { |
|||
} |
|||
|
|||
record FileInfo(String filePath, String name) { |
|||
} |
|||
|
|||
|
|||
@GetMapping("/index") |
|||
public String fileDownloadPage(Model model) { |
|||
// Mock data for file groups and files |
|||
List<FileGroup> fileGroups = List.of( |
|||
new FileGroup("Group 1", List.of(new FileInfo("runenv/files/optReport/20241112152609.txt", "File1.txt"), new FileInfo("", "File2.txt"))), |
|||
new FileGroup("Group 2", List.of(new FileInfo("", "File3.txt"), new FileInfo("", "File4.txt"))) |
|||
); |
|||
model.addAttribute("fileGroups", fileGroups); |
|||
return "filemgr/index.html"; |
|||
} |
|||
|
|||
// @GetMapping("/download/{fileId}") |
|||
// public ResponseEntity<Resource> downloadFile(@RequestParam("file") MultipartFile file) { |
|||
// String realpath = String.format(FilePathConstant.FILE_DOWNLOAD_PATH + "/%s", path); |
|||
// String contentDisposition = ContentDisposition |
|||
// .builder("attachment") |
|||
// .filename(path) // Use the original filename |
|||
// .build().toString(); |
|||
// return ResponseEntity.ok() |
|||
// .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) |
|||
// .body(new FileSystemResource(realpath)); |
|||
// } |
|||
// |
|||
// @GetMapping("/download/{path}") |
|||
// @ResponseBody |
|||
// public ResponseEntity<Resource> download(@PathVariable String path) { |
|||
// log.info("Download file: {}", path); |
|||
// // String realpath = String.format(FilePathConstant.FILE_DOWNLOAD_PATH + "/%s", path); |
|||
// String contentDisposition = ContentDisposition |
|||
// .builder("attachment") |
|||
// .filename(path) // Use the original filename |
|||
// .build().toString(); |
|||
// return ResponseEntity.ok() |
|||
// .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) |
|||
// .body(new FileSystemResource(path)); |
|||
// } |
|||
|
|||
@GetMapping("/download/**") |
|||
@ResponseBody |
|||
public ResponseEntity<Resource> download(HttpServletRequest request) { |
|||
String path = request.getRequestURI().substring("/filemgr/download/".length()); |
|||
String fileName = Paths.get(path).getFileName().toString(); |
|||
log.info("Download file:{} path:{}", fileName, path); |
|||
|
|||
File file = new File(path); |
|||
|
|||
String contentDisposition = ContentDisposition |
|||
.builder("attachment") |
|||
.filename(fileName) // Use the original filename |
|||
.build().toString(); |
|||
return ResponseEntity.ok() |
|||
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) |
|||
.body(new FileSystemResource(file.getAbsolutePath())); |
|||
} |
|||
} |
@ -1,8 +1,200 @@ |
|||
package a8k.service.app.appdata; |
|||
|
|||
import a8k.a8kproj.optalgo.type.A8kOptPeak; |
|||
import a8k.a8kproj.optalgo.type.OptAlgoAnalysResult; |
|||
import a8k.a8kproj.optalgo.type.OptScanResult; |
|||
import a8k.a8kproj.optalgo.type.PeakFindState; |
|||
import a8k.a8kproj.opttype.PeakDivision; |
|||
import a8k.a8kproj.opttype.PeakName; |
|||
import a8k.constant.FilePathConstant; |
|||
import a8k.service.dao.type.OptRawScanData; |
|||
import a8k.service.dao.type.a8kidcard.zenum.A8kOptType; |
|||
import a8k.utils.ZDateUtils; |
|||
import cn.hutool.core.io.FileUtil; |
|||
import jakarta.annotation.PostConstruct; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import java.io.File; |
|||
import java.io.FileWriter; |
|||
import java.io.IOException; |
|||
import java.util.Date; |
|||
|
|||
@Slf4j |
|||
@Component |
|||
public class FileMgrService { |
|||
private String createOptReportContent(String projName, Integer projId, OptScanResult optScanResult) { |
|||
StringBuilder sb = new StringBuilder(); |
|||
sb.append("日期").append("\n"); |
|||
sb.append(ZDateUtils.toDateString(optScanResult.rawData.scanDate)).append("\n"); |
|||
sb.append("项目名称").append("\n"); |
|||
sb.append(projName).append("\n"); |
|||
sb.append("项目ID").append("\n"); |
|||
sb.append(projId).append("\n"); |
|||
sb.append("光学类型").append("\n"); |
|||
sb.append(optScanResult.rawData.optType).append("\n"); |
|||
sb.append("发射增益").append("\n"); |
|||
sb.append(optScanResult.rawData.lasterGain).append("\n"); |
|||
sb.append("接收增益").append("\n"); |
|||
sb.append(optScanResult.rawData.scanGain).append("\n"); |
|||
sb.append("\n"); |
|||
|
|||
sb.append("T4").append("\n"); |
|||
if (optScanResult.analysResult.T4 == null || optScanResult.analysResult.T4.state == PeakFindState.NOT_FIND_PEAK) { |
|||
sb.append("\n\n\n\n"); |
|||
} else { |
|||
sb.append(optScanResult.analysResult.T4.peakStartPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.T4.peakEndPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.T4.peakPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.T4.area).append("\n"); |
|||
} |
|||
|
|||
|
|||
sb.append("R").append("\n"); |
|||
if (optScanResult.analysResult.R == null || optScanResult.analysResult.R.state == PeakFindState.NOT_FIND_PEAK) { |
|||
sb.append("\n\n\n\n"); |
|||
} else { |
|||
sb.append(optScanResult.analysResult.R.peakStartPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.R.peakEndPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.R.peakPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.R.area).append("\n"); |
|||
} |
|||
|
|||
sb.append("H").append("\n"); |
|||
if (optScanResult.analysResult.H == null || optScanResult.analysResult.H.state == PeakFindState.NOT_FIND_PEAK) { |
|||
sb.append("\n\n\n\n"); |
|||
} else { |
|||
sb.append(optScanResult.analysResult.H.peakStartPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.H.peakEndPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.H.peakPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.H.area).append("\n"); |
|||
} |
|||
|
|||
|
|||
sb.append("T").append("\n"); |
|||
if (optScanResult.analysResult.T == null || optScanResult.analysResult.T.state == PeakFindState.NOT_FIND_PEAK) { |
|||
sb.append("\n\n\n\n"); |
|||
} else { |
|||
sb.append(optScanResult.analysResult.T.peakStartPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.T.peakEndPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.T.peakPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.T.area).append("\n"); |
|||
} |
|||
|
|||
sb.append("C").append("\n"); |
|||
if (optScanResult.analysResult.C == null || optScanResult.analysResult.C.state == PeakFindState.NOT_FIND_PEAK) { |
|||
sb.append("\n\n\n\n"); |
|||
} else { |
|||
sb.append(optScanResult.analysResult.C.peakStartPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.C.peakEndPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.C.peakPos).append("\n"); |
|||
sb.append(optScanResult.analysResult.C.area).append("\n"); |
|||
} |
|||
sb.append("\n"); |
|||
|
|||
sb.append("R(").append(PeakDivision.R.numerator).append("/").append(PeakDivision.R.denominator).append(")").append("\n"); |
|||
sb.append(optScanResult.analysResult.pdR).append("\n"); |
|||
sb.append("AR(").append(PeakDivision.AR.numerator).append("/").append(PeakDivision.AR.denominator).append(")").append("\n"); |
|||
sb.append(optScanResult.analysResult.pdAR).append("\n"); |
|||
sb.append("ATR(").append(PeakDivision.ATR.numerator).append("/").append(PeakDivision.ATR.denominator).append(")").append("\n"); |
|||
sb.append(optScanResult.analysResult.pdATR).append("\n"); |
|||
sb.append("RFR(").append(PeakDivision.RFR.numerator).append("/").append(PeakDivision.RFR.denominator).append(")").append("\n"); |
|||
sb.append(optScanResult.analysResult.pdRFR).append("\n"); |
|||
sb.append("T4R(").append(PeakDivision.T4R.numerator).append("/").append(PeakDivision.T4R.denominator).append(")").append("\n"); |
|||
sb.append(optScanResult.analysResult.pdT4R).append("\n"); |
|||
sb.append("T4T3R(").append(PeakDivision.T4T3R.numerator).append("/").append(PeakDivision.T4T3R.denominator).append(")").append("\n"); |
|||
sb.append(optScanResult.analysResult.pdT4T3R).append("\n"); |
|||
sb.append("\n"); |
|||
|
|||
|
|||
sb.append("解析后的数据(250个点)").append("\n"); |
|||
for (int i = 0; i < 250; i++) { |
|||
if (i < optScanResult.analysResult.resultData.length) { |
|||
sb.append(optScanResult.analysResult.resultData[i]).append("\n"); |
|||
} else { |
|||
sb.append(" ").append("\n"); |
|||
} |
|||
} |
|||
sb.append("\n"); |
|||
|
|||
sb.append("原始数据(1200个点)").append("\n"); |
|||
for (int i = 0; i < 1200; i++) { |
|||
if (i < optScanResult.rawData.rawData.length) { |
|||
sb.append(optScanResult.rawData.rawData[i]).append("\n"); |
|||
} else { |
|||
sb.append(" ").append("\n"); |
|||
} |
|||
} |
|||
sb.append("\n"); |
|||
return sb.toString(); |
|||
} |
|||
|
|||
|
|||
public String createOptReport(String projName, Integer projId, OptScanResult optScanResult) throws IOException { |
|||
|
|||
File dir = new File(FilePathConstant.FILE_OPT_REPORT_PATH); |
|||
dir.mkdir(); |
|||
|
|||
String path = String.format("%s/%s.txt", FilePathConstant.FILE_OPT_REPORT_PATH, ZDateUtils.toID(optScanResult.rawData.scanDate)); |
|||
File file = new File(path); |
|||
|
|||
FileWriter writer = new FileWriter(file.getAbsolutePath()); |
|||
String content = createOptReportContent(projName, projId, optScanResult); |
|||
writer.write(content); |
|||
writer.close(); |
|||
return file.getAbsolutePath(); |
|||
} |
|||
|
|||
public void createFakeOptReport() throws IOException { |
|||
OptRawScanData data = new OptRawScanData(); |
|||
data.id = 1; |
|||
data.dataid = ZDateUtils.toID(new Date()); |
|||
data.scanDate = new Date(); |
|||
data.optType = A8kOptType.FOPT; |
|||
data.lasterGain = 10; |
|||
data.scanGain = 11; |
|||
data.rawData = new Integer[1200]; |
|||
for (int i = 0; i < 1200; i++) { |
|||
data.rawData[i] = i; |
|||
} |
|||
|
|||
OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult(); |
|||
optAlgoAnalysResult.T4 = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T4, 0, 1.1, 40, 0, 80); |
|||
optAlgoAnalysResult.R = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.R, 0, 1.1, 80, 40, 120); |
|||
optAlgoAnalysResult.H = null; |
|||
optAlgoAnalysResult.T = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.T, 0, 1.1, 160, 120, 200); |
|||
optAlgoAnalysResult.C = new A8kOptPeak(PeakFindState.FIND_PEAK, PeakName.C, 0, 1.1, 200, 160, 240); |
|||
optAlgoAnalysResult.pdR = 1.1; |
|||
optAlgoAnalysResult.pdAR = 1.2; |
|||
optAlgoAnalysResult.pdATR = 1.3; |
|||
optAlgoAnalysResult.pdRFR = 1.4; |
|||
optAlgoAnalysResult.pdT4R = 1.5; |
|||
optAlgoAnalysResult.pdT4T3R = 1.6; |
|||
optAlgoAnalysResult.rawData = new Integer[1200]; |
|||
for (int i = 0; i < 1200; i++) { |
|||
optAlgoAnalysResult.rawData[i] = i; |
|||
} |
|||
optAlgoAnalysResult.resultData = new double[250]; |
|||
for (int i = 0; i < 250; i++) { |
|||
optAlgoAnalysResult.resultData[i] = i; |
|||
} |
|||
|
|||
OptScanResult optScanResult = new OptScanResult(); |
|||
optScanResult.rawData = data; |
|||
optScanResult.analysResult = optAlgoAnalysResult; |
|||
|
|||
String path = createOptReport("Fake", 1, optScanResult); |
|||
log.info("createFakeOptReport success {}", path); |
|||
} |
|||
|
|||
|
|||
// public static void main(String[] args) { |
|||
// FileMgrService fileMgrService = new FileMgrService(); |
|||
// try { |
|||
// fileMgrService.createFakeOptReport(); |
|||
// } catch (IOException e) { |
|||
// e.printStackTrace(); |
|||
// } |
|||
// } |
|||
|
|||
} |
@ -1,41 +0,0 @@ |
|||
<!-- src/main/resources/static/filemgr/index.html --> |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<title>File Upload</title> |
|||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> |
|||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.css" /> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.1/jquery.modal.min.js"></script> |
|||
</head> |
|||
<body> |
|||
<h1>Upload a File</h1> |
|||
<form id="uploadForm" enctype="multipart/form-data"> |
|||
<input type="file" name="file" /> |
|||
<button type="submit">Upload</button> |
|||
</form> |
|||
<div id="message" class="modal"></div> |
|||
|
|||
<script> |
|||
$(document).ready(function() { |
|||
$('#uploadForm').on('submit', function(event) { |
|||
event.preventDefault(); |
|||
var formData = new FormData(this); |
|||
$.ajax({ |
|||
url: '/filemgr/upload', |
|||
type: 'POST', |
|||
data: formData, |
|||
contentType: false, |
|||
processData: false, |
|||
success: function(response) { |
|||
$('#message').text(response).modal(); |
|||
}, |
|||
error: function() { |
|||
$('#message').text('Failed to upload file.').modal(); |
|||
} |
|||
}); |
|||
}); |
|||
}); |
|||
</script> |
|||
</body> |
|||
</html> |
@ -0,0 +1,23 @@ |
|||
<!-- src/main/resources/templates/filemgr/index.html --> |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8"> |
|||
<title>文件管理</title> |
|||
</head> |
|||
<body> |
|||
<h1>文件下载</h1> |
|||
<div> |
|||
<div th:each="group : ${fileGroups}"> |
|||
<h2 th:text="${group.name}"></h2> |
|||
<div th:each="file : ${group.files}"> |
|||
<a th:href="@{'/filemgr/download/' + ${file.filePath}}"> |
|||
<button> |
|||
<span th:text="${file.name}"></span> |
|||
</button> |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</body> |
|||
</html> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue