package com.its.bis.webapp.service; import com.its.app.utils.OS; import com.its.bis.webapp.vo.FileInfoVo; import lombok.extern.slf4j.Slf4j; import net.sf.json.JSONObject; import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.Resource; import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @Slf4j @Service public class FileService { private final String logDir= "/logs/"; private final String sysDir= System.getProperty("user.dir"); private final String[] exceptDir ={"backup"}; private int id = 1; public String getView(HttpServletRequest request, String fileName, String filePath) { long preEndPoint = request.getParameter("preEndPoint") == null ? 0 : Long.parseLong(request.getParameter("preEndPoint") + ""); StringBuilder sb = new StringBuilder(); long startPoint, endPoint; RandomAccessFile file = null; String errMsg = ""; try { file = new RandomAccessFile(System.getProperty("user.dir") + filePath + fileName, "r"); endPoint = file.length(); startPoint = preEndPoint > 0 ? preEndPoint : endPoint < 2000 ? 0 : endPoint - 2000; file.seek(startPoint); String str; while ((str = file.readLine()) != null) { byte[] b = str.getBytes("iso-8859-1"); str = new String(b, "UTF-8"); sb.append(str); sb.append("
"); endPoint = file.getFilePointer(); file.seek(endPoint); } JSONObject json = new JSONObject(); json.put("endPoint", endPoint); json.put("log", sb.toString()); return json.toString(); } catch(FileNotFoundException fnf) { log.error("FileService.getView: Exception: {}", fnf.toString()); errMsg += fnf.toString(); } catch (IOException e) { log.error(e.getMessage()); errMsg += e.toString(); } finally { try { if (file != null) file.close(); } catch (Exception e) { log.error("FileService.getView: Exception: {}", e.toString()); errMsg += e.toString(); } } if (!errMsg.equals("")) { sb.append(errMsg); sb.append("
"); JSONObject json = new JSONObject(); json.put("endPoint", 0); json.put("log", sb.toString()); return json.toString(); } return null; } public ResponseEntity fileDownload(String fileName, String filePath){ try { Path path = Paths.get(System.getProperty("user.dir")+filePath+ fileName); String contentType = "application/download"; HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, contentType); headers.setContentDisposition(ContentDisposition.parse("attachment;" + " filename=\"" + fileName + "\";")); Resource resource = new InputStreamResource(Files.newInputStream(path)); return new ResponseEntity<>(resource, headers, HttpStatus.OK); } catch (IOException e) { log.error("FileService.fileDownload: Exception: {}", e.toString()); } return null; } public void fileDelete(String fileName,String filePath) { File file = new File(this.sysDir+filePath+fileName); if (file.exists()) { if (file.delete()) { log.info("FileService.fileDelete: Delete Success: {}", filePath+fileName); } else { log.error("FileService.fileDelete: Delete Fail: {}", filePath+fileName); } } else { log.warn("FileService.fileDelete: Not exists: {}", filePath+fileName); } } public List getLogFiles() { this.id = 1; FileInfoVo rootFile = new FileInfoVo(); rootFile.setId(id); rootFile.setType("dir"); this.id++; rootFile.setFileName("logs"); rootFile.setFileInfos(getFiles(this.sysDir, this.logDir)); List fileInfos = new ArrayList<>(); fileInfos.add(rootFile); return fileInfos; } private List getFiles(String sysDir, String logDir) { int rootId = id - 1; //log.debug("FileService.getFiles: id: {}, sysDir: {}, logDir: {}", id, sysDir, logDir); List subArr = new ArrayList<>(); File dirFile = new File(sysDir, logDir); File[] fileList = dirFile.listFiles(); for (File file: fileList) { FileInfoVo info = new FileInfoVo(); //log.debug("FileService.getFiles: getName: {}, isDir: {}, getPath: {}", file.getName(), file.isDirectory(), file.getPath()); if (file.isDirectory()) { for (String dir : exceptDir) { if (dir.equals(file.getName())) { break; } else { String subDir = file.getPath().substring(file.getPath().indexOf(logDir.replaceAll("/", "")), file.getPath().length()); info.setId(id); id++; String sFileSeparator = "/"; info.setFilePath(sFileSeparator + subDir); info.setFileName(file.getName()); info.setFileSize(file.length()); info.setType("dir"); info.setFileInfos(getFiles(sysDir, subDir)); info.setParentId(rootId); //log.info(info.toString()); subArr.add(info); } } } } //log.debug("x: {}", fileList.toString()); for (File file: fileList) { FileInfoVo info = new FileInfoVo(); if (file.isFile() && file.getName().contains(".log")) { info.setId(id); id++; info.setFileName(file.getName()); info.setFileSize(file.length()); String subDir; if (OS.isWindows()) { subDir = file.getPath().substring(file.getPath().indexOf(logDir.replaceAll("/","")), file.getPath().length() - file.getName().length()).replaceAll("\\\\", "/"); } else { subDir = file.getPath().substring(file.getPath().indexOf(logDir), file.getPath().length() - file.getName().length()).replaceAll("\\\\", "/"); } String sFileSeparator = "/"; info.setFilePath(sFileSeparator + subDir); info.setType("log"); info.setParentId(rootId); //log.info(info.toString()); subArr.add(info); } } //log.debug("y: {}", subArr.toString()); return subArr; } }