Skip to content

Commit 5165348

Browse files
authored
Kl json (#686)
* 新增:JSON 文件格式化预览功能 * 优化:优化 JSON 文件格式化预览效果
1 parent a9787b0 commit 5165348

3 files changed

Lines changed: 286 additions & 52 deletions

File tree

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
package cn.keking.service.impl;
22

3+
import cn.keking.config.ConfigConstants;
34
import cn.keking.model.FileAttribute;
5+
import cn.keking.model.ReturnResponse;
6+
import cn.keking.service.FileHandlerService;
47
import cn.keking.service.FilePreview;
8+
import cn.keking.utils.DownloadUtils;
9+
import cn.keking.utils.KkFileUtils;
10+
import org.apache.commons.codec.binary.Base64;
511
import org.springframework.stereotype.Service;
612
import org.springframework.ui.Model;
13+
import org.springframework.web.util.HtmlUtils;
14+
15+
import java.io.*;
16+
import java.nio.charset.StandardCharsets;
17+
import java.nio.file.Files;
18+
import java.nio.file.Paths;
19+
720

821
/**
922
* @author kl (http://kailing.pub)
@@ -13,15 +26,66 @@
1326
@Service
1427
public class JsonFilePreviewImpl implements FilePreview {
1528

16-
private final SimTextFilePreviewImpl simTextFilePreview;
29+
private final FileHandlerService fileHandlerService;
30+
private final OtherFilePreviewImpl otherFilePreview;
1731

18-
public JsonFilePreviewImpl(SimTextFilePreviewImpl simTextFilePreview) {
19-
this.simTextFilePreview = simTextFilePreview;
32+
public JsonFilePreviewImpl(FileHandlerService fileHandlerService, OtherFilePreviewImpl otherFilePreview) {
33+
this.fileHandlerService = fileHandlerService;
34+
this.otherFilePreview = otherFilePreview;
2035
}
2136

2237
@Override
2338
public String filePreviewHandle(String url, Model model, FileAttribute fileAttribute) {
24-
simTextFilePreview.filePreviewHandle(url, model, fileAttribute);
39+
String fileName = fileAttribute.getName();
40+
boolean forceUpdatedCache = fileAttribute.forceUpdatedCache();
41+
String filePath = fileAttribute.getOriginFilePath();
42+
43+
if (forceUpdatedCache || !fileHandlerService.listConvertedFiles().containsKey(fileName) || !ConfigConstants.isCacheEnabled()) {
44+
ReturnResponse<String> response = DownloadUtils.downLoad(fileAttribute, fileName);
45+
if (response.isFailure()) {
46+
return otherFilePreview.notSupportedFile(model, fileAttribute, response.getMsg());
47+
}
48+
filePath = response.getContent();
49+
if (ConfigConstants.isCacheEnabled()) {
50+
fileHandlerService.addConvertedFile(fileName, filePath);
51+
}
52+
try {
53+
String fileData = readJsonFile(filePath, fileName);
54+
String escapedData = HtmlUtils.htmlEscape(fileData);
55+
String base64Data = Base64.encodeBase64String(escapedData.getBytes(StandardCharsets.UTF_8));
56+
model.addAttribute("textData", base64Data);
57+
} catch (IOException e) {
58+
return otherFilePreview.notSupportedFile(model, fileAttribute, e.getLocalizedMessage());
59+
}
60+
return JSON_FILE_PREVIEW_PAGE;
61+
}
62+
63+
String fileData = null;
64+
try {
65+
fileData = HtmlUtils.htmlEscape(readJsonFile(filePath, fileName));
66+
} catch (IOException e) {
67+
e.printStackTrace();
68+
}
69+
String base64Data = Base64.encodeBase64String(fileData.getBytes(StandardCharsets.UTF_8));
70+
model.addAttribute("textData", base64Data);
2571
return JSON_FILE_PREVIEW_PAGE;
2672
}
73+
74+
/**
75+
* 读取 JSON 文件,强制使用 UTF-8 编码
76+
* JSON 标准规定必须使用 UTF-8 编码
77+
*/
78+
private String readJsonFile(String filePath, String fileName) throws IOException {
79+
File file = new File(filePath);
80+
if (KkFileUtils.isIllegalFileName(fileName)) {
81+
return null;
82+
}
83+
if (!file.exists() || file.length() == 0) {
84+
return "";
85+
}
86+
87+
// JSON 标准规定使用 UTF-8 编码,不依赖自动检测
88+
byte[] bytes = Files.readAllBytes(Paths.get(filePath));
89+
return new String(bytes, StandardCharsets.UTF_8);
90+
}
2791
}

server/src/main/java/cn/keking/service/impl/SimTextFilePreviewImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri
4747
}
4848
try {
4949
String fileData = HtmlUtils.htmlEscape(textData(filePath,fileName));
50-
model.addAttribute("textData", Base64.encodeBase64String(fileData.getBytes()));
50+
model.addAttribute("textData", Base64.encodeBase64String(fileData.getBytes(StandardCharsets.UTF_8)));
5151
} catch (IOException e) {
5252
return otherFilePreview.notSupportedFile(model, fileAttribute, e.getLocalizedMessage());
5353
}
@@ -59,7 +59,7 @@ public String filePreviewHandle(String url, Model model, FileAttribute fileAttri
5959
} catch (IOException e) {
6060
e.printStackTrace();
6161
}
62-
model.addAttribute("textData", Base64.encodeBase64String(fileData.getBytes()));
62+
model.addAttribute("textData", Base64.encodeBase64String(fileData.getBytes(StandardCharsets.UTF_8)));
6363
return TXT_FILE_PREVIEW_PAGE;
6464
}
6565

0 commit comments

Comments
 (0)