Compare commits
89 Commits
v4.4.0-bet
...
codex/ci-a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
352b86b40d | ||
|
|
853ad0154f | ||
|
|
c88bf04a0d | ||
|
|
6a84e61ecb | ||
|
|
dd6e369e6a | ||
|
|
bd20546b6d | ||
|
|
c41c14bf3c | ||
|
|
3fbf0156e2 | ||
|
|
530304b832 | ||
|
|
5499150395 | ||
|
|
2dcc62f3da | ||
|
|
405a12ef07 | ||
|
|
bb0734b3d3 | ||
|
|
a9e394950f | ||
|
|
be6023701c | ||
|
|
02bcd35779 | ||
|
|
b6dd8129ea | ||
|
|
db5cd68a1e | ||
|
|
d1c310ab63 | ||
|
|
b10e14899d | ||
|
|
eee3a2ed38 | ||
|
|
68d4d23a4b | ||
|
|
bb457924cd | ||
|
|
a0d78c57e3 | ||
|
|
7f16243270 | ||
|
|
36a75e86ac | ||
|
|
7c41200028 | ||
|
|
3da0c523e8 | ||
|
|
8c3bc81e08 | ||
|
|
9d72706c2d | ||
|
|
0aa8de27d4 | ||
|
|
b08f4657e5 | ||
|
|
1e04822532 | ||
|
|
4e5e9b7cba | ||
|
|
a2fe4658c4 | ||
|
|
e43f10138f | ||
|
|
7dc0469b30 | ||
|
|
904af89190 | ||
|
|
2425bea9b6 | ||
|
|
b5579ae890 | ||
|
|
595f3f55f2 | ||
|
|
c96b7ebd1e | ||
|
|
9a3ec88390 | ||
|
|
ea35da6694 | ||
|
|
00a8e094db | ||
|
|
58d0b24b16 | ||
|
|
b20637652a | ||
|
|
e1e146cb5f | ||
|
|
e52f374252 | ||
|
|
daab5963bc | ||
|
|
38a9c142e2 | ||
|
|
4afe1caa33 | ||
|
|
2dd008532a | ||
|
|
92ca92bee6 | ||
|
|
64c82a2406 | ||
|
|
e44ef813a1 | ||
|
|
9f3b45a4c7 | ||
|
|
b1af0c7d72 | ||
|
|
421640221b | ||
|
|
f6c6e22b0d | ||
|
|
51653483b9 | ||
|
|
a9787b0add | ||
|
|
6cdbf92fb0 | ||
|
|
fdb40680d3 | ||
|
|
6746325bf2 | ||
|
|
05a8bff1e0 | ||
|
|
874ff5b3f6 | ||
|
|
2230cfa52b | ||
|
|
83c581364d | ||
|
|
1d39360c60 | ||
|
|
8c763599fe | ||
|
|
9632f6070c | ||
|
|
cc63659650 | ||
|
|
177f389814 | ||
|
|
406e9ea6ee | ||
|
|
bb461cd74a | ||
|
|
782509376c | ||
|
|
63dc58d088 | ||
|
|
77f5adb19f | ||
|
|
7abfb67451 | ||
|
|
c8dc638c29 | ||
|
|
48ac926289 | ||
|
|
0a4ae41b0c | ||
|
|
bb0139bee6 | ||
|
|
7bf07cb64c | ||
|
|
ab370e66a5 | ||
|
|
421a2760d5 | ||
|
|
9150346926 | ||
|
|
b65a04857c |
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: "Security Report / 安全漏洞报告"
|
||||||
|
url: "https://github.com/kekingcn/kkFileView/security/advisories/new"
|
||||||
|
about: "For sensitive security issues, please use private security report. / 涉及敏感安全问题请使用私密安全报告。"
|
||||||
76
.github/ISSUE_TEMPLATE/feature-request.yml
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
name: "Feature Request / 功能建议"
|
||||||
|
description: "Propose a new feature with clear use case and acceptance criteria. / 提交功能建议,请明确场景与验收标准。"
|
||||||
|
title: "[FEATURE] "
|
||||||
|
labels: ["type/feature", "priority/p2", "status/needs-info"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for your idea! / 感谢你的建议!
|
||||||
|
|
||||||
|
Please provide concrete business scenarios and the expected behavior.
|
||||||
|
请尽量提供明确业务场景和期望行为,便于评估优先级与实现方案。
|
||||||
|
|
||||||
|
For urgent production issues, you can use our Knowledge Planet channel for faster processing:
|
||||||
|
https://wx.zsxq.com/group/48844125114258
|
||||||
|
如为线上紧急问题,可通过知识星球渠道加速处理:
|
||||||
|
https://wx.zsxq.com/group/48844125114258
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: background
|
||||||
|
attributes:
|
||||||
|
label: "Background / 背景"
|
||||||
|
description: "What problem are you trying to solve? / 你要解决什么问题?"
|
||||||
|
placeholder: "Describe current pain points... / 描述当前痛点..."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: proposal
|
||||||
|
attributes:
|
||||||
|
label: "Proposal / 建议方案"
|
||||||
|
description: "What do you expect kkFileView to support? / 期望 kkFileView 支持什么?"
|
||||||
|
placeholder: "Describe expected feature behavior... / 描述期望功能行为..."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: use_case
|
||||||
|
attributes:
|
||||||
|
label: "Use Case / 使用场景"
|
||||||
|
description: "Provide 1-3 concrete scenarios. / 提供 1-3 个具体场景"
|
||||||
|
placeholder: |
|
||||||
|
Scenario 1:
|
||||||
|
Scenario 2:
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: alternatives
|
||||||
|
attributes:
|
||||||
|
label: "Alternatives / 备选方案"
|
||||||
|
description: "What alternatives have you considered? / 是否考虑过替代方案?"
|
||||||
|
placeholder: "Existing workaround or alternative... / 当前替代做法..."
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: acceptance
|
||||||
|
attributes:
|
||||||
|
label: "Acceptance Criteria / 验收标准"
|
||||||
|
description: "How do we know this feature is done? / 如何判断该功能完成?"
|
||||||
|
placeholder: |
|
||||||
|
- [ ] Criterion 1
|
||||||
|
- [ ] Criterion 2
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: "Checklist / 提交前检查"
|
||||||
|
options:
|
||||||
|
- label: "I have searched existing issues and did not find a duplicate feature request. / 我已搜索现有 issue,未发现重复功能建议"
|
||||||
|
required: true
|
||||||
|
- label: "I provided concrete use cases and expected behavior. / 我已提供具体使用场景和期望行为"
|
||||||
|
required: true
|
||||||
121
.github/ISSUE_TEMPLATE/issue-report.yml
vendored
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
name: "Issue Report / 问题反馈"
|
||||||
|
description: "Please provide complete required information to help us reproduce and follow up. / 请完整填写必填信息,便于复现与跟进。"
|
||||||
|
title: "[ISSUE] "
|
||||||
|
labels: ["status/needs-info"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for your report! / 感谢反馈!
|
||||||
|
|
||||||
|
**Please fill in all required fields.**
|
||||||
|
**请完整填写所有必填项。**
|
||||||
|
|
||||||
|
Incomplete issues may be closed and asked to resubmit.
|
||||||
|
信息不完整的问题可能会被关闭并要求重新提交。
|
||||||
|
|
||||||
|
For urgent production issues, you can use our Knowledge Planet channel for faster processing:
|
||||||
|
https://wx.zsxq.com/group/48844125114258
|
||||||
|
如为线上紧急问题,可通过知识星球渠道加速处理:
|
||||||
|
https://wx.zsxq.com/group/48844125114258
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: issue_type
|
||||||
|
attributes:
|
||||||
|
label: "Issue Type / 问题类型"
|
||||||
|
description: "Select the closest type. / 请选择最接近的问题类型"
|
||||||
|
options:
|
||||||
|
- "Bug / 缺陷"
|
||||||
|
- "Performance / 性能问题"
|
||||||
|
- "Security / 安全问题"
|
||||||
|
- "Question / 使用咨询"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: kkfileview_version
|
||||||
|
attributes:
|
||||||
|
label: "kkFileView Version / kkFileView 版本"
|
||||||
|
placeholder: "e.g. 4.4.0"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: input
|
||||||
|
id: deploy_mode
|
||||||
|
attributes:
|
||||||
|
label: "Deployment Mode / 部署方式"
|
||||||
|
description: "jar / docker / k8s / source, etc. / jar / docker / k8s / 源码部署等"
|
||||||
|
placeholder: "e.g. docker"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: environment
|
||||||
|
attributes:
|
||||||
|
label: "Environment / 环境信息"
|
||||||
|
description: "OS, JDK, LibreOffice/OpenOffice, browser, reverse proxy, etc. / 操作系统、JDK、Office组件、浏览器、反向代理等"
|
||||||
|
placeholder: |
|
||||||
|
- OS:
|
||||||
|
- JDK:
|
||||||
|
- LibreOffice/OpenOffice:
|
||||||
|
- Browser:
|
||||||
|
- Proxy (Nginx/Ingress):
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce_steps
|
||||||
|
attributes:
|
||||||
|
label: "Steps to Reproduce / 复现步骤"
|
||||||
|
description: "Provide clear, minimal, reproducible steps. / 提供清晰、最小可复现步骤"
|
||||||
|
placeholder: |
|
||||||
|
1) ...
|
||||||
|
2) ...
|
||||||
|
3) ...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: expected_result
|
||||||
|
attributes:
|
||||||
|
label: "Expected Result / 期望结果"
|
||||||
|
placeholder: "What should happen? / 期望实际应该出现什么结果?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: actual_result
|
||||||
|
attributes:
|
||||||
|
label: "Actual Result / 实际结果"
|
||||||
|
placeholder: "What happened instead? / 实际发生了什么?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: "Logs & Screenshots / 日志与截图"
|
||||||
|
description: "Paste key logs/error stack and attach screenshots (mask sensitive data). / 粘贴关键日志或异常堆栈,并上传截图(请脱敏)"
|
||||||
|
render: shell
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: sample_file
|
||||||
|
attributes:
|
||||||
|
label: "Sample File / 样例文件(可选)"
|
||||||
|
description: "If possible, provide a minimal sample file or reproducible URL (desensitized). / 如可提供,请附最小样例文件或可复现 URL(脱敏)"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
|
||||||
|
- type: checkboxes
|
||||||
|
id: checklist
|
||||||
|
attributes:
|
||||||
|
label: "Checklist / 提交前检查"
|
||||||
|
options:
|
||||||
|
- label: "I have searched existing issues and did not find a duplicate. / 我已搜索现有 issue,未发现重复问题"
|
||||||
|
required: true
|
||||||
|
- label: "I can reproduce this issue on the stated version/environment. / 我可在上述版本与环境复现该问题"
|
||||||
|
required: true
|
||||||
|
- label: "I have masked sensitive information in logs/screenshots. / 我已对日志与截图中的敏感信息做脱敏处理"
|
||||||
|
required: true
|
||||||
109
.github/scripts/deploy_windows_winrm.py
vendored
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import base64
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
import winrm
|
||||||
|
|
||||||
|
|
||||||
|
def require_env(name: str) -> str:
|
||||||
|
value = os.getenv(name, "").strip()
|
||||||
|
if not value:
|
||||||
|
raise SystemExit(f"Missing required environment variable: {name}")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def optional_env(name: str, default: str) -> str:
|
||||||
|
value = os.getenv(name, "").strip()
|
||||||
|
return value if value else default
|
||||||
|
|
||||||
|
|
||||||
|
def ps_quote(value: str) -> str:
|
||||||
|
return value.replace("'", "''")
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
host = require_env("KK_DEPLOY_HOST")
|
||||||
|
port = optional_env("KK_DEPLOY_PORT", "5985")
|
||||||
|
username = require_env("KK_DEPLOY_USERNAME")
|
||||||
|
password = require_env("KK_DEPLOY_PASSWORD")
|
||||||
|
deploy_root = optional_env("KK_DEPLOY_ROOT", r"C:\kkFileView-5.0")
|
||||||
|
health_url = optional_env("KK_DEPLOY_HEALTH_URL", "http://127.0.0.1:8012/")
|
||||||
|
artifact_name = optional_env("KK_DEPLOY_ARTIFACT_NAME", "kkfileview-server-jar")
|
||||||
|
repository = require_env("GITHUB_REPOSITORY_NAME")
|
||||||
|
run_id = require_env("GITHUB_RUN_ID_VALUE")
|
||||||
|
artifact_token = require_env("KK_DEPLOY_ARTIFACT_TOKEN")
|
||||||
|
dry_run = optional_env("KK_DEPLOY_DRY_RUN", "false").lower()
|
||||||
|
|
||||||
|
script_path = pathlib.Path(__file__).with_name("remote_windows_deploy.ps1")
|
||||||
|
script_body = script_path.read_text(encoding="utf-8")
|
||||||
|
payload = script_body.encode("utf-8-sig")
|
||||||
|
payload_b64 = base64.b64encode(payload).decode("ascii")
|
||||||
|
|
||||||
|
endpoint = f"http://{host}:{port}/wsman"
|
||||||
|
session = winrm.Session(endpoint, auth=(username, password), transport="ntlm")
|
||||||
|
|
||||||
|
suffix = uuid.uuid4().hex
|
||||||
|
remote_b64_path = fr"C:\Windows\Temp\kkfileview_deploy_{suffix}.b64"
|
||||||
|
remote_ps1_path = fr"C:\Windows\Temp\kkfileview_deploy_{suffix}.ps1"
|
||||||
|
|
||||||
|
prep = session.run_ps(
|
||||||
|
f"""
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
if (Test-Path '{ps_quote(remote_b64_path)}') {{ Remove-Item '{ps_quote(remote_b64_path)}' -Force }}
|
||||||
|
if (Test-Path '{ps_quote(remote_ps1_path)}') {{ Remove-Item '{ps_quote(remote_ps1_path)}' -Force }}
|
||||||
|
New-Item -ItemType File -Path '{ps_quote(remote_b64_path)}' -Force | Out-Null
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
if prep.status_code != 0:
|
||||||
|
sys.stderr.write(prep.std_err.decode("utf-8", errors="ignore"))
|
||||||
|
return prep.status_code
|
||||||
|
|
||||||
|
chunk_size = 1200
|
||||||
|
for start in range(0, len(payload_b64), chunk_size):
|
||||||
|
chunk = payload_b64[start : start + chunk_size]
|
||||||
|
append = session.run_ps(
|
||||||
|
f"Add-Content -LiteralPath '{ps_quote(remote_b64_path)}' -Value '{chunk}'"
|
||||||
|
)
|
||||||
|
if append.status_code != 0:
|
||||||
|
sys.stderr.write(append.std_err.decode("utf-8", errors="ignore"))
|
||||||
|
return append.status_code
|
||||||
|
|
||||||
|
result = session.run_ps(
|
||||||
|
f"""
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
$raw = Get-Content -LiteralPath '{ps_quote(remote_b64_path)}' -Raw
|
||||||
|
[System.IO.File]::WriteAllBytes('{ps_quote(remote_ps1_path)}', [Convert]::FromBase64String($raw))
|
||||||
|
try {{
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File '{ps_quote(remote_ps1_path)}' `
|
||||||
|
-Repository '{ps_quote(repository)}' `
|
||||||
|
-RunId '{ps_quote(run_id)}' `
|
||||||
|
-ArtifactName '{ps_quote(artifact_name)}' `
|
||||||
|
-GitHubToken '{ps_quote(artifact_token)}' `
|
||||||
|
-DeployRoot '{ps_quote(deploy_root)}' `
|
||||||
|
-HealthUrl '{ps_quote(health_url)}' `
|
||||||
|
-DryRun '{ps_quote(dry_run)}'
|
||||||
|
$code = $LASTEXITCODE
|
||||||
|
}} finally {{
|
||||||
|
Remove-Item '{ps_quote(remote_b64_path)}' -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item '{ps_quote(remote_ps1_path)}' -Force -ErrorAction SilentlyContinue
|
||||||
|
}}
|
||||||
|
exit $code
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
stdout = result.std_out.decode("utf-8", errors="ignore").strip()
|
||||||
|
stderr = result.std_err.decode("utf-8", errors="ignore").strip()
|
||||||
|
|
||||||
|
if stdout:
|
||||||
|
print(stdout)
|
||||||
|
if stderr:
|
||||||
|
print(stderr, file=sys.stderr)
|
||||||
|
|
||||||
|
return result.status_code
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
183
.github/scripts/remote_windows_deploy.ps1
vendored
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
param(
|
||||||
|
[Parameter(Mandatory = $true)][string]$Repository,
|
||||||
|
[Parameter(Mandatory = $true)][string]$RunId,
|
||||||
|
[Parameter(Mandatory = $true)][string]$ArtifactName,
|
||||||
|
[Parameter(Mandatory = $true)][string]$GitHubToken,
|
||||||
|
[Parameter(Mandatory = $true)][string]$DeployRoot,
|
||||||
|
[Parameter(Mandatory = $true)][string]$HealthUrl,
|
||||||
|
[string]$DryRun = 'false'
|
||||||
|
)
|
||||||
|
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
function Write-Step {
|
||||||
|
param([string]$Message)
|
||||||
|
Write-Host "==> $Message"
|
||||||
|
}
|
||||||
|
|
||||||
|
$BinDir = Join-Path $DeployRoot 'bin'
|
||||||
|
$StartupScript = Join-Path $BinDir 'startup.bat'
|
||||||
|
$ReleaseDir = Join-Path $DeployRoot 'releases'
|
||||||
|
$DeployTmp = Join-Path $DeployRoot 'deploy-tmp'
|
||||||
|
$ArtifactZip = Join-Path $DeployTmp 'artifact.zip'
|
||||||
|
$ExtractDir = Join-Path $DeployTmp 'artifact'
|
||||||
|
|
||||||
|
if (-not (Test-Path $DeployRoot)) {
|
||||||
|
throw "Deploy root not found: $DeployRoot"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path $BinDir)) {
|
||||||
|
throw "Bin directory not found: $BinDir"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path $StartupScript)) {
|
||||||
|
throw "Startup script not found: $StartupScript"
|
||||||
|
}
|
||||||
|
|
||||||
|
$CurrentJar = Get-ChildItem $BinDir -Filter 'kkFileView-*.jar' | Sort-Object LastWriteTime -Descending | Select-Object -First 1
|
||||||
|
if (-not $CurrentJar) {
|
||||||
|
throw "No kkFileView jar found in $BinDir"
|
||||||
|
}
|
||||||
|
|
||||||
|
$JarName = $CurrentJar.Name
|
||||||
|
$JarPath = $CurrentJar.FullName
|
||||||
|
|
||||||
|
Write-Step "Deploy root: $DeployRoot"
|
||||||
|
Write-Step "Current jar: $JarPath"
|
||||||
|
Write-Step "Startup script: $StartupScript"
|
||||||
|
Write-Step "Health url: $HealthUrl"
|
||||||
|
|
||||||
|
if ($DryRun -eq 'true') {
|
||||||
|
Write-Step "Dry run enabled, remote validation finished"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
New-Item -ItemType Directory -Force -Path $ReleaseDir | Out-Null
|
||||||
|
New-Item -ItemType Directory -Force -Path $DeployTmp | Out-Null
|
||||||
|
|
||||||
|
if (Test-Path $ArtifactZip) {
|
||||||
|
Remove-Item $ArtifactZip -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-Path $ExtractDir) {
|
||||||
|
Remove-Item $ExtractDir -Recurse -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
$Headers = @{
|
||||||
|
Authorization = "Bearer $GitHubToken"
|
||||||
|
Accept = "application/vnd.github+json"
|
||||||
|
"X-GitHub-Api-Version" = "2022-11-28"
|
||||||
|
"User-Agent" = "kkFileView-auto-deploy"
|
||||||
|
}
|
||||||
|
|
||||||
|
$ArtifactsApi = "https://api.github.com/repos/$Repository/actions/runs/$RunId/artifacts"
|
||||||
|
Write-Step "Resolving workflow artifact: $ArtifactName"
|
||||||
|
$ArtifactsResponse = Invoke-RestMethod -Headers $Headers -Uri $ArtifactsApi -Method Get
|
||||||
|
$Artifact = $ArtifactsResponse.artifacts | Where-Object { $_.name -eq $ArtifactName } | Select-Object -First 1
|
||||||
|
|
||||||
|
if (-not $Artifact) {
|
||||||
|
throw "Artifact '$ArtifactName' not found for workflow run $RunId"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Step "Downloading artifact from GitHub Actions"
|
||||||
|
Invoke-WebRequest -Headers $Headers -Uri $Artifact.archive_download_url -OutFile $ArtifactZip
|
||||||
|
Expand-Archive -LiteralPath $ArtifactZip -DestinationPath $ExtractDir -Force
|
||||||
|
|
||||||
|
$DownloadedJars = Get-ChildItem $ExtractDir -Filter 'kkFileView-*.jar' -Recurse
|
||||||
|
if (-not $DownloadedJars) {
|
||||||
|
throw "No kkFileView jar found inside artifact '$ArtifactName'"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($DownloadedJars.Count -ne 1) {
|
||||||
|
throw "Expected exactly one kkFileView jar inside artifact '$ArtifactName', found $($DownloadedJars.Count)"
|
||||||
|
}
|
||||||
|
|
||||||
|
$DownloadedJar = $DownloadedJars[0]
|
||||||
|
|
||||||
|
$Timestamp = Get-Date -Format 'yyyyMMddHHmmss'
|
||||||
|
$BackupJar = Join-Path $ReleaseDir ("{0}.{1}.bak" -f $JarName, $Timestamp)
|
||||||
|
|
||||||
|
function Stop-KkFileView {
|
||||||
|
$JarPattern = [regex]::Escape($JarName)
|
||||||
|
$Processes = Get-CimInstance Win32_Process | Where-Object {
|
||||||
|
$_.Name -match '^java(\.exe)?$' -and $_.CommandLine -and $_.CommandLine -match $JarPattern
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($Process in $Processes) {
|
||||||
|
Write-Step "Stopping java process $($Process.ProcessId)"
|
||||||
|
Stop-Process -Id $Process.ProcessId -Force -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Wait-KkFileViewStopped {
|
||||||
|
param([int]$TimeoutSeconds = 30)
|
||||||
|
|
||||||
|
$JarPattern = [regex]::Escape($JarName)
|
||||||
|
for ($i = 0; $i -lt $TimeoutSeconds; $i++) {
|
||||||
|
$Processes = Get-CimInstance Win32_Process | Where-Object {
|
||||||
|
$_.Name -match '^java(\.exe)?$' -and $_.CommandLine -and $_.CommandLine -match $JarPattern
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $Processes) {
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
|
||||||
|
function Start-KkFileView {
|
||||||
|
Write-Step "Starting kkFileView"
|
||||||
|
Start-Process -FilePath 'cmd.exe' -ArgumentList '/c', "`"$StartupScript`"" -WorkingDirectory $BinDir -WindowStyle Hidden
|
||||||
|
}
|
||||||
|
|
||||||
|
function Wait-Health {
|
||||||
|
param([string]$Url)
|
||||||
|
|
||||||
|
for ($i = 0; $i -lt 24; $i++) {
|
||||||
|
Start-Sleep -Seconds 5
|
||||||
|
try {
|
||||||
|
$Response = Invoke-WebRequest -Uri $Url -UseBasicParsing -TimeoutSec 5
|
||||||
|
if ($Response.StatusCode -eq 200) {
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Start-Sleep -Milliseconds 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Step "Backing up current jar to $BackupJar"
|
||||||
|
Copy-Item $JarPath $BackupJar -Force
|
||||||
|
|
||||||
|
Stop-KkFileView
|
||||||
|
if (-not (Wait-KkFileViewStopped)) {
|
||||||
|
throw "Timed out waiting for the previous kkFileView process to exit"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Step "Replacing jar with artifact output"
|
||||||
|
Copy-Item $DownloadedJar.FullName $JarPath -Force
|
||||||
|
|
||||||
|
Start-KkFileView
|
||||||
|
|
||||||
|
if (-not (Wait-Health -Url $HealthUrl)) {
|
||||||
|
Write-Step "Health check failed, rolling back"
|
||||||
|
Stop-KkFileView
|
||||||
|
if (-not (Wait-KkFileViewStopped)) {
|
||||||
|
throw "Timed out waiting for the failed kkFileView process to exit during rollback"
|
||||||
|
}
|
||||||
|
Copy-Item $BackupJar $JarPath -Force
|
||||||
|
Start-KkFileView
|
||||||
|
|
||||||
|
if (-not (Wait-Health -Url $HealthUrl)) {
|
||||||
|
throw "Deployment failed and rollback health check also failed"
|
||||||
|
}
|
||||||
|
|
||||||
|
throw "Deployment failed, rollback completed successfully"
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Step "Deployment completed successfully"
|
||||||
78
.github/workflows/auto-close-old-issues.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
name: Auto Close Old Issues (1y)
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# Daily at 02:20 UTC
|
||||||
|
- cron: '20 2 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
close_old_issues:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Close issues older than 1 year
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
const now = new Date();
|
||||||
|
const cutoff = new Date(now.getTime() - 365 * 24 * 60 * 60 * 1000);
|
||||||
|
|
||||||
|
const closeComment = `该 Issue 已超过 1 年未活跃,为便于维护当前问题队列,先做关闭处理。\n\n如该问题在最新版本仍存在,欢迎直接 **Reopen** 本 Issue(或新建 Issue 并关联本单),并补充:\n1. 版本与部署方式\n2. 最小复现步骤\n3. 关键日志/截图(请脱敏)\n\n我们会优先跟进。`;
|
||||||
|
|
||||||
|
let page = 1;
|
||||||
|
let processed = 0;
|
||||||
|
while (true) {
|
||||||
|
const { data: issues } = await github.rest.issues.listForRepo({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
state: 'open',
|
||||||
|
per_page: 100,
|
||||||
|
page,
|
||||||
|
sort: 'created',
|
||||||
|
direction: 'asc'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!issues.length) break;
|
||||||
|
|
||||||
|
for (const issue of issues) {
|
||||||
|
// skip pull requests
|
||||||
|
if (issue.pull_request) continue;
|
||||||
|
|
||||||
|
const createdAt = new Date(issue.created_at);
|
||||||
|
if (createdAt > cutoff) {
|
||||||
|
// list is sorted asc by created time; remaining items are newer
|
||||||
|
core.info('Reached issues newer than cutoff, stop scanning.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
body: closeComment,
|
||||||
|
});
|
||||||
|
|
||||||
|
await github.rest.issues.update({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
state: 'closed',
|
||||||
|
});
|
||||||
|
|
||||||
|
processed += 1;
|
||||||
|
core.info(`Closed #${issue.number}`);
|
||||||
|
} catch (e) {
|
||||||
|
core.warning(`Failed to close #${issue.number}: ${e.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
page += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
core.info(`Done. Closed ${processed} old issues.`);
|
||||||
34
.github/workflows/copilot-issue-auto-comment.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: Copilot Issue Auto Comment
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
copilot_auto_comment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Ask Copilot to triage issue automatically
|
||||||
|
uses: actions/github-script@v7
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const issue = context.payload.issue;
|
||||||
|
if (!issue) return;
|
||||||
|
|
||||||
|
const owner = context.repo.owner;
|
||||||
|
const repo = context.repo.repo;
|
||||||
|
|
||||||
|
const body = `@Copilot 请自动分诊并直接给出可执行建议(无需人工先介入):\n\n- 先判断类型:Bug / Performance / Security / Question / Feature\n- 检查 Issue 信息是否完整(版本、部署方式、复现步骤、日志)\n- 若信息不完整:请直接按模板列出缺失项并引导补充\n- 若信息较完整:请给出下一步排查建议与最小复现建议\n- 若判断为已知问题或已修复:请给出对应版本/修复方向\n\nIssue #${issue.number}\n标题:${issue.title}\n链接:${issue.html_url}\n\n---\n\n补充说明 / Support Notice:\n- GitHub Issues 会持续跟进处理 / We will continue to follow up through GitHub Issues.\n- 如为线上紧急问题,可通过知识星球渠道加速处理 / For urgent production issues, you can use our Knowledge Planet channel for faster processing:\n https://wx.zsxq.com/group/48844125114258`;
|
||||||
|
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner,
|
||||||
|
repo,
|
||||||
|
issue_number: issue.number,
|
||||||
|
body,
|
||||||
|
});
|
||||||
|
|
||||||
|
core.info(`Copilot prompt comment posted to #${issue.number}`);
|
||||||
76
.github/workflows/master-auto-deploy.yml
vendored
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
name: Master Auto Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: master-auto-deploy-production
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
actions: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
java-version: '21'
|
||||||
|
distribution: temurin
|
||||||
|
cache: maven
|
||||||
|
|
||||||
|
- name: Build with Maven
|
||||||
|
run: mvn -B package -Dmaven.test.skip=true --file pom.xml
|
||||||
|
|
||||||
|
- name: Upload server jar artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: kkfileview-server-jar
|
||||||
|
path: server/target/kkFileView-*.jar
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
deploy-windows:
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
env:
|
||||||
|
GITHUB_REPOSITORY_NAME: ${{ github.repository }}
|
||||||
|
GITHUB_RUN_ID_VALUE: ${{ github.run_id }}
|
||||||
|
KK_DEPLOY_ARTIFACT_TOKEN: ${{ secrets.KK_DEPLOY_ARTIFACT_TOKEN }}
|
||||||
|
KK_DEPLOY_HOST: ${{ secrets.KK_DEPLOY_HOST }}
|
||||||
|
KK_DEPLOY_PORT: ${{ secrets.KK_DEPLOY_PORT }}
|
||||||
|
KK_DEPLOY_USERNAME: ${{ secrets.KK_DEPLOY_USERNAME }}
|
||||||
|
KK_DEPLOY_PASSWORD: ${{ secrets.KK_DEPLOY_PASSWORD }}
|
||||||
|
KK_DEPLOY_ROOT: ${{ secrets.KK_DEPLOY_ROOT }}
|
||||||
|
KK_DEPLOY_HEALTH_URL: ${{ secrets.KK_DEPLOY_HEALTH_URL }}
|
||||||
|
KK_DEPLOY_ARTIFACT_NAME: kkfileview-server-jar
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install WinRM dependencies
|
||||||
|
run: pip install pywinrm
|
||||||
|
|
||||||
|
- name: Validate deploy secrets
|
||||||
|
run: |
|
||||||
|
test -n "$KK_DEPLOY_ARTIFACT_TOKEN" || (echo "Missing secret: KK_DEPLOY_ARTIFACT_TOKEN" && exit 1)
|
||||||
|
test -n "$KK_DEPLOY_HOST" || (echo "Missing secret: KK_DEPLOY_HOST" && exit 1)
|
||||||
|
test -n "$KK_DEPLOY_USERNAME" || (echo "Missing secret: KK_DEPLOY_USERNAME" && exit 1)
|
||||||
|
test -n "$KK_DEPLOY_PASSWORD" || (echo "Missing secret: KK_DEPLOY_PASSWORD" && exit 1)
|
||||||
|
|
||||||
|
- name: Deploy to Windows server
|
||||||
|
run: python .github/scripts/deploy_windows_winrm.py
|
||||||
42
.github/workflows/maven.yml
vendored
@@ -12,13 +12,41 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- name: Checkout repository
|
||||||
- name: Set up JDK 8
|
uses: actions/checkout@v4
|
||||||
uses: actions/setup-java@v2
|
|
||||||
|
- name: Set up JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
java-version: '8'
|
java-version: '21'
|
||||||
distribution: 'adopt'
|
distribution: 'temurin' # 使用 Eclipse Temurin (AdoptOpenJDK 的继任者)
|
||||||
cache: maven
|
cache: 'maven'
|
||||||
|
|
||||||
|
- name: Cache Maven packages
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ~/.m2/repository
|
||||||
|
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-maven-
|
||||||
|
|
||||||
- name: Build with Maven
|
- name: Build with Maven
|
||||||
run: mvn -B package --file pom.xml
|
run: mvn -B package -Dmaven.test.skip=true --file pom.xml
|
||||||
|
|
||||||
|
- name: Upload Linux distribution package
|
||||||
|
if: success()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: kkfileview-linux
|
||||||
|
path: server/target/*.tar.gz
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
- name: Upload Windows distribution package
|
||||||
|
if: success()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: kkfileview-windows
|
||||||
|
path: server/target/*.zip
|
||||||
|
retention-days: 7
|
||||||
|
|||||||
118
.github/workflows/nightly-e2e.yml
vendored
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
name: Nightly E2E Full
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '30 18 * * *' # 02:30 Asia/Shanghai
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
e2e-nightly:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 50
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: temurin
|
||||||
|
java-version: '21'
|
||||||
|
cache: maven
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: tests/e2e/package-lock.json
|
||||||
|
|
||||||
|
- name: Setup Python 3.11
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install LibreOffice + archive tools
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libreoffice zip p7zip-full
|
||||||
|
|
||||||
|
- name: Setup Python deps for office fixtures
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install -r tests/e2e/requirements.txt
|
||||||
|
|
||||||
|
- name: Build kkFileView
|
||||||
|
run: mvn -q -pl server -DskipTests package
|
||||||
|
|
||||||
|
- name: Install E2E deps
|
||||||
|
working-directory: tests/e2e
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
npx playwright install --with-deps chromium
|
||||||
|
|
||||||
|
- name: Start fixture server
|
||||||
|
run: |
|
||||||
|
cd tests/e2e/fixtures
|
||||||
|
python3 -m http.server 18080 > /tmp/fixture-server.log 2>&1 &
|
||||||
|
|
||||||
|
- name: Start kkFileView
|
||||||
|
run: |
|
||||||
|
JAR_PATH=$(ls server/target/kkFileView-*.jar | head -n 1)
|
||||||
|
nohup env KK_TRUST_HOST='*' KK_NOT_TRUST_HOST='10.*,172.16.*,192.168.*' java -jar "$JAR_PATH" > /tmp/kkfileview.log 2>&1 &
|
||||||
|
|
||||||
|
- name: Wait for services
|
||||||
|
run: |
|
||||||
|
fixture_ready=false
|
||||||
|
for i in {1..60}; do
|
||||||
|
if curl -fsS http://127.0.0.1:18080/sample.txt >/dev/null; then
|
||||||
|
fixture_ready=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
if [ "$fixture_ready" != "true" ]; then
|
||||||
|
echo "Error: fixture server did not become ready within 60 seconds." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
kkfileview_ready=false
|
||||||
|
for i in {1..120}; do
|
||||||
|
if curl -fsS http://127.0.0.1:8012/ >/dev/null; then
|
||||||
|
kkfileview_ready=true
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
if [ "$kkfileview_ready" != "true" ]; then
|
||||||
|
echo "Error: kkFileView service did not become ready within 120 seconds." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Run nightly E2E suites
|
||||||
|
working-directory: tests/e2e
|
||||||
|
env:
|
||||||
|
KK_BASE_URL: http://127.0.0.1:8012
|
||||||
|
FIXTURE_BASE_URL: http://127.0.0.1:18080
|
||||||
|
E2E_MAX_PREVIEW_MS: 20000
|
||||||
|
run: npm run test:ci
|
||||||
|
|
||||||
|
- name: Upload Playwright report
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: nightly-playwright-report
|
||||||
|
path: tests/e2e/playwright-report
|
||||||
|
|
||||||
|
- name: Upload service logs
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: nightly-e2e-service-logs
|
||||||
|
path: |
|
||||||
|
/tmp/kkfileview.log
|
||||||
|
/tmp/fixture-server.log
|
||||||
100
.github/workflows/pr-e2e-mvp.yml
vendored
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
name: PR E2E MVP
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches: [master]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
e2e-mvp:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 40
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Setup JDK 21
|
||||||
|
uses: actions/setup-java@v4
|
||||||
|
with:
|
||||||
|
distribution: temurin
|
||||||
|
java-version: '21'
|
||||||
|
cache: maven
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
cache: 'npm'
|
||||||
|
cache-dependency-path: tests/e2e/package-lock.json
|
||||||
|
|
||||||
|
- name: Setup Python 3.11
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install LibreOffice + archive tools
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libreoffice zip p7zip-full
|
||||||
|
|
||||||
|
- name: Setup Python deps for office fixtures
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
pip install -r tests/e2e/requirements.txt
|
||||||
|
|
||||||
|
- name: Build kkFileView
|
||||||
|
run: mvn -q -pl server -DskipTests package
|
||||||
|
|
||||||
|
- name: Install E2E deps
|
||||||
|
working-directory: tests/e2e
|
||||||
|
run: |
|
||||||
|
npm install
|
||||||
|
npx playwright install --with-deps chromium
|
||||||
|
|
||||||
|
- name: Start fixture server
|
||||||
|
run: |
|
||||||
|
cd tests/e2e/fixtures
|
||||||
|
python3 -m http.server 18080 > /tmp/fixture-server.log 2>&1 &
|
||||||
|
|
||||||
|
- name: Start kkFileView
|
||||||
|
run: |
|
||||||
|
JAR_PATH=$(ls server/target/kkFileView-*.jar | head -n 1)
|
||||||
|
nohup env KK_TRUST_HOST='*' KK_NOT_TRUST_HOST='10.*,172.16.*,192.168.*' java -jar "$JAR_PATH" > /tmp/kkfileview.log 2>&1 &
|
||||||
|
|
||||||
|
- name: Wait for services
|
||||||
|
run: |
|
||||||
|
for i in {1..60}; do
|
||||||
|
curl -fsS http://127.0.0.1:18080/sample.txt >/dev/null && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
for i in {1..120}; do
|
||||||
|
curl -fsS http://127.0.0.1:8012/ >/dev/null && break
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: Run E2E
|
||||||
|
working-directory: tests/e2e
|
||||||
|
env:
|
||||||
|
KK_BASE_URL: http://127.0.0.1:8012
|
||||||
|
FIXTURE_BASE_URL: http://127.0.0.1:18080
|
||||||
|
run: npm test
|
||||||
|
|
||||||
|
- name: Upload Playwright report
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: playwright-report
|
||||||
|
path: tests/e2e/playwright-report
|
||||||
|
|
||||||
|
- name: Upload service logs
|
||||||
|
if: always()
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: e2e-service-logs
|
||||||
|
path: |
|
||||||
|
/tmp/kkfileview.log
|
||||||
|
/tmp/fixture-server.log
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
FROM keking/kkfileview-jdk:latest
|
FROM keking/kkfileview-base:4.4.0
|
||||||
MAINTAINER chenjh "842761733@qq.com"
|
|
||||||
ADD server/target/kkFileView-*.tar.gz /opt/
|
ADD server/target/kkFileView-*.tar.gz /opt/
|
||||||
ENV KKFILEVIEW_BIN_FOLDER /opt/kkFileView-4.4.0-beta/bin
|
ENV KKFILEVIEW_BIN_FOLDER=/opt/kkFileView-4.4.0/bin
|
||||||
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Dspring.config.location=/opt/kkFileView-4.4.0-beta/config/application.properties","-jar","/opt/kkFileView-4.4.0-beta/bin/kkFileView-4.4.0-beta.jar"]
|
ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-Dspring.config.location=/opt/kkFileView-4.4.0/config/application.properties","-jar","/opt/kkFileView-4.4.0/bin/kkFileView-4.4.0.jar"]
|
||||||
|
|||||||
143
README.cn.md
@@ -1,6 +1,6 @@
|
|||||||
# kkFileView
|
# kkFileView
|
||||||
文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览,如:
|
文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览,如:
|
||||||
1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla ,pages 等 Office 办公文档
|
1. 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx,xlam, xla ,pages ,pptm 等 Office 办公文档
|
||||||
2. 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档
|
2. 支持 wps, dps, et, ett, wpt 等国产 WPS Office 办公文档
|
||||||
3. 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档
|
3. 支持 odt, ods, ots, odp, otp, six, ott, fodt, fods 等OpenOffice、LibreOffice 办公文档
|
||||||
4. 支持 vsd, vsdx 等 Visio 流程图文件
|
4. 支持 vsd, vsdx 等 Visio 流程图文件
|
||||||
@@ -9,18 +9,18 @@
|
|||||||
7. 支持 pdf ,ofd, rtf 等文档
|
7. 支持 pdf ,ofd, rtf 等文档
|
||||||
8. 支持 xmind 软件模型文件
|
8. 支持 xmind 软件模型文件
|
||||||
9. 支持 bpmn 工作流文件
|
9. 支持 bpmn 工作流文件
|
||||||
10. 支持 eml 邮件文件
|
10. 支持 eml, msg 邮件文件
|
||||||
11. 支持 epub 图书文档
|
11. 支持 epub 图书文档
|
||||||
12. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
|
12. 支持 obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim 等 3D 模型文件
|
||||||
13. 支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件
|
13. 支持 dwg, dxf, dwf, iges , igs, dwt, dng, ifc, dwfx, stl, cf2, plt 等 CAD 模型文件
|
||||||
14. 支持 txt, xml(渲染), xbrl(渲染), md(渲染), java, php, py, js, css 等所有纯文本
|
14. 支持 txt, xml(渲染), xbrl(渲染), md(渲染), java, php, py, js, css 等所有纯文本
|
||||||
15. 支持 zip, rar, jar, tar, gzip, 7z 等压缩包
|
15. 支持 zip, rar, jar, tar, gzip, 7z 等压缩包
|
||||||
16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp 等图片预览(翻转,缩放,镜像)
|
16. 支持 jpg, jpeg, png, gif, bmp, ico, jfif, webp ,heic ,heif等图片预览(翻转,缩放,镜像)
|
||||||
17. 支持 tif, tiff 图信息模型文件
|
17. 支持 tif, tiff 图信息模型文件
|
||||||
18. 支持 tga 图像格式文件
|
18. 支持 tga 图像格式文件
|
||||||
19. 支持 svg 矢量图像格式文件
|
19. 支持 svg 矢量图像格式文件
|
||||||
20. 支持 mp3,wav,mp4,flv 等音视频格式文件
|
20. 支持 mp3,wav,mp4,flv 等音视频格式文件
|
||||||
21. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts,swf 等视频格式转码预览
|
21. 支持 avi,mov,rm,webm,ts,rm,mkv,mpeg,ogg,mpg,rmvb,wmv,3gp,ts 等视频格式转码预览
|
||||||
22. 支持 dcm 等医疗数位影像预览
|
22. 支持 dcm 等医疗数位影像预览
|
||||||
23. 支持 drawio 绘图预览
|
23. 支持 drawio 绘图预览
|
||||||
|
|
||||||
@@ -53,80 +53,81 @@
|
|||||||
#### 1. 文本预览
|
#### 1. 文本预览
|
||||||
支持所有类型的文本文档预览, 由于文本文档类型过多,无法全部枚举,默认开启的类型如下 txt,html,htm,asp,jsp,xml,xbrl,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd
|
支持所有类型的文本文档预览, 由于文本文档类型过多,无法全部枚举,默认开启的类型如下 txt,html,htm,asp,jsp,xml,xbrl,json,properties,md,gitignore,log,java,py,c,cpp,sql,sh,bat,m,bas,prg,cmd
|
||||||
文本预览效果如下
|
文本预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 2. 图片预览
|
#### 2. 图片预览
|
||||||
支持jpg,jpeg,png,gif等图片预览(翻转,缩放,镜像),预览效果如下
|
支持jpg,jpeg,png,gif等图片预览(翻转,缩放,镜像),预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 3. word文档预览
|
#### 3. word文档预览
|
||||||
支持doc,docx文档预览,word预览有两种模式:一种是每页word转为图片预览,另一种是整个word文档转成pdf,再预览pdf。两种模式的适用场景如下
|
支持doc,docx文档预览,word预览有两种模式:一种是每页word转为图片预览,另一种是整个word文档转成pdf,再预览pdf。两种模式的适用场景如下
|
||||||
* 图片预览:word文件大,前台加载整个pdf过慢
|
* 图片预览:word文件大,前台加载整个pdf过慢
|
||||||
* pdf预览:内网访问,加载pdf快
|
* pdf预览:内网访问,加载pdf快
|
||||||
图片预览模式预览效果如下
|
图片预览模式预览效果如下
|
||||||

|

|
||||||
pdf预览模式预览效果如下
|
pdf预览模式预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 4. ppt文档预览
|
#### 4. ppt文档预览
|
||||||
支持ppt,pptx文档预览,和word文档一样,有两种预览模式
|
支持ppt,pptx文档预览,和word文档一样,有两种预览模式
|
||||||
图片预览模式预览效果如下
|
图片预览模式预览效果如下
|
||||||

|

|
||||||
pdf预览模式预览效果如下
|
pdf预览模式预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 5. pdf文档预览
|
#### 5. pdf文档预览
|
||||||
支持pdf文档预览,和word文档一样,有两种预览模式
|
支持pdf文档预览,和word文档一样,有两种预览模式
|
||||||
图片预览模式预览效果如下
|
图片预览模式预览效果如下
|
||||||

|

|
||||||
pdf预览模式预览效果如下
|
pdf预览模式预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 6. excel文档预览
|
#### 6. excel文档预览
|
||||||
支持xls,xlsx文档预览,预览效果如下
|
支持xls,xlsx文档预览,预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 7. 压缩文件预览
|
#### 7. 压缩文件预览
|
||||||
支持zip,rar,jar,tar,gzip等压缩包,预览效果如下
|
支持zip,rar,jar,tar,gzip等压缩包,预览效果如下
|
||||||

|

|
||||||
可点击压缩包中的文件名,直接预览文件,预览效果如下
|
可点击压缩包中的文件名,直接预览文件,预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 8. 多媒体文件预览
|
#### 8. 多媒体文件预览
|
||||||
理论上支持所有的视频、音频文件,由于无法枚举所有文件格式,默认开启的类型如下
|
理论上支持所有的视频、音频文件,由于无法枚举所有文件格式,默认开启的类型如下
|
||||||
mp3,wav,mp4,flv
|
mp3,wav,mp4,flv
|
||||||
视频预览效果如下
|
视频预览效果如下
|
||||||

|

|
||||||
音频预览效果如下
|
音频预览效果如下
|
||||||

|

|
||||||
|
|
||||||
#### 9. CAD文档预览
|
#### 9. CAD文档预览
|
||||||
支持CAD dwg文档预览,和word文档一样,有两种预览模式
|
支持CAD dwg文档预览,和word文档一样,有两种预览模式
|
||||||
图片预览模式预览效果如下
|
图片预览模式预览效果如下
|
||||||

|

|
||||||
pdf预览模式预览效果如下
|
pdf预览模式预览效果如下
|
||||||

|

|
||||||
考虑说明篇幅原因,就不贴其他格式文件的预览效果了,感兴趣的可以参考下面的实例搭建下
|
|
||||||
|
|
||||||
#### 10. Excel文件纯前端渲染效果
|
#### 10. Excel文件纯前端渲染效果
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
#### 11. 流程图bpmn文件预览效果
|
#### 11. 流程图bpmn文件预览效果
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
#### 12. 3D模型文件预览效果:
|
#### 12. 3D模型文件预览效果:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
#### 13. dcm医疗数位影像文件预览效果:
|
#### 13. dcm医疗数位影像文件预览效果:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
#### 14. drawio流程图预览效果:
|
#### 14. drawio流程图预览效果:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
考虑说明篇幅原因,就不贴其他格式文件的预览效果了,感兴趣的可以参考下面的实例搭建下
|
||||||
|
|
||||||
### 快速开始
|
### 快速开始
|
||||||
> 项目使用技术
|
> 项目使用技术
|
||||||
@@ -148,7 +149,97 @@ pdf预览模式预览效果如下
|
|||||||
|
|
||||||
### 历史更新记录
|
### 历史更新记录
|
||||||
|
|
||||||
#### > 2023年07月05日,v4.3 版本发布 :
|
#### > 2026年01月20日,v5.0 版本发布 :
|
||||||
|
#### 优化内容
|
||||||
|
1. xlsx 前端解析优化 - 提升Excel文件前端渲染性能
|
||||||
|
2. 图片解析优化 - 改进图片处理机制
|
||||||
|
3. tif 解析优化 - 增强TIF格式支持
|
||||||
|
4. svg 解析优化 - 优化SVG矢量图渲染
|
||||||
|
5. json 解析优化 - 改进JSON文件处理
|
||||||
|
6. ftp多客户端接入优化 - 提升FTP服务兼容性
|
||||||
|
7. 首页目录访问优化 - 采用post服务端分页机制
|
||||||
|
8. marked 解析优化 - 改进Markdown渲染
|
||||||
|
|
||||||
|
#### 新增功能
|
||||||
|
1. msg邮件解析 - 新增msg格式邮件文件预览支持
|
||||||
|
2. heic图片解析 - 新增HEIC格式图片预览支持
|
||||||
|
3. 跨域方法 - 新增跨域处理机制
|
||||||
|
4. 高亮方法 - 新增文本高亮功能
|
||||||
|
5. 页码方法 - 新增文档页码控制
|
||||||
|
6. AES加密方法 - 新增AES加密支持
|
||||||
|
7. Basic鉴权方法 - 新增Basic认证机制
|
||||||
|
8. 秘钥方法 - 新增密钥管理功能
|
||||||
|
9. 防重复转换 - 新增重复文件转换防护
|
||||||
|
10. 异步等待 - 新增异步处理机制
|
||||||
|
11. 上传限制 - 新增不支持文件上传限制
|
||||||
|
12. cadviewer转换方法 - 新增CAD查看器转换功能
|
||||||
|
|
||||||
|
#### 修复问题
|
||||||
|
1. 压缩包路径问题 - 修复压缩包内部路径处理
|
||||||
|
2. 安全问题 - 修复安全漏洞
|
||||||
|
3. 图片水印不全问题 - 修复水印显示不完整
|
||||||
|
4. SSL自签证书接入问题 - 修复自签名证书兼容性
|
||||||
|
|
||||||
|
#### 更新内容
|
||||||
|
1. JDK版本要求 - 强制要求JDK 21及以上版本
|
||||||
|
2. pdf前端解析更新 - 升级PDF前端渲染组件
|
||||||
|
3. odf前端解析更新 - 升级ODF文档前端渲染
|
||||||
|
4. 3D模型前端解析更新 - 升级3D模型查看器
|
||||||
|
5. pdf后端异步转换优化 - 实现多线程异步转换
|
||||||
|
6. tif后端异步转换优化 - 实现多线程异步转换
|
||||||
|
7. 视频后端异步转换优化 - 实现多线程异步转换
|
||||||
|
8. CAD后端异步转换优化 - 实现多线程异步转换
|
||||||
|
|
||||||
|
#### > 2025年01月16日,v4.4.0 版本发布 :
|
||||||
|
|
||||||
|
### 新增功能
|
||||||
|
1. xlsx 新增支持打印功能
|
||||||
|
2. 配置文件新增启用 GZIP 压缩
|
||||||
|
3. CAD 格式新增支持转换成 SVG 和 TIF 格式,新增超时结束、线程管理
|
||||||
|
4. 新增删除文件使用验证码校验
|
||||||
|
5. 新增 xbrl 格式预览支持
|
||||||
|
6. PDF 预览新增控制签名、绘图、插图控制、搜索定位页码、定义显示内容等功能
|
||||||
|
7. 新增 CSV 格式前端解析支持
|
||||||
|
8. 新增 ARM64 下的 Docker 镜像支持
|
||||||
|
9. 新增 Office 预览支持转换超时属性设置功能
|
||||||
|
10. 新增预览文件 host 黑名单机制
|
||||||
|
|
||||||
|
### 优化
|
||||||
|
1. 优化 OFD 移动端预览 页面不自适应
|
||||||
|
2. 更新 xlsx 前端解析组件,加速解析速度
|
||||||
|
3. 升级 CAD 组件
|
||||||
|
4. office 功能调整,支持批注、转换页码限制、生成水印等功能
|
||||||
|
5. 升级 markdown 组件
|
||||||
|
6. 升级 dcm 解析组件
|
||||||
|
7. 升级 PDF.JS 解析组件
|
||||||
|
8. 更换视频播放插件为 ckplayer
|
||||||
|
9. tif 解析更加智能化,支持被修改的图片格式
|
||||||
|
10. 针对大小文本文件检测字符编码的正确率,处理并发隐患
|
||||||
|
11. 重构下载文件的代码,新增通用的文件服务器认证访问的设计
|
||||||
|
12. 更新 bootstrap 组件,并精简掉不需要的文件
|
||||||
|
13. 更新 epub 版本,优化 epub 显示效果
|
||||||
|
14. 解决定时清除缓存时,对于多媒体类型文件,只删除了磁盘缓存文件
|
||||||
|
15. 自动检测已安装 Office 组件,增加 LibreOffice 7.5 & 7.6 版本默认路径
|
||||||
|
16. 修改 drawio 默认为预览模式
|
||||||
|
17. 新增 PDF 线程管理、超时管理、内存缓存管理,更新 PDF 解析组件版本
|
||||||
|
18. 优化 Dockerfile,支持真正的跨平台构建镜像
|
||||||
|
|
||||||
|
### 修复
|
||||||
|
1. 修复 forceUpdatedCache 属性设置,但本地缓存文件不更新的问题
|
||||||
|
2. 修复 PDF 解密加密文件转换成功后后台报错的问题
|
||||||
|
3. 修复 BPMN 不支持跨域的问题
|
||||||
|
4. 修复压缩包二级反代特殊符号错误问题
|
||||||
|
5. 修复视频跨域配置导致视频无法预览的问题
|
||||||
|
6. 修复 TXT 文本类分页二次加载问题
|
||||||
|
7. 修复 Drawio 缺少 Base64 组件的问题
|
||||||
|
8. 修复 Markdown 被转义问题
|
||||||
|
9. 修复 EPUB 跨域报错问题
|
||||||
|
10. 修复 URL 特殊符号问题
|
||||||
|
11. 修复压缩包穿越漏洞
|
||||||
|
12. 修复压缩获取路径错误、图片合集路径错误、水印问题等 BUG
|
||||||
|
13. 修复前端解析 XLSX 包含 EMF 格式文件错误问题
|
||||||
|
|
||||||
|
#### > 2023年07月05日,v4.3.0 版本发布 :
|
||||||
|
|
||||||
#### 新增功能:
|
#### 新增功能:
|
||||||
1. 新增dcm等医疗数位影像预
|
1. 新增dcm等医疗数位影像预
|
||||||
|
|||||||
174
README.md
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Document online preview project solution, built using the popular Spring Boot framework for easy setup and deployment. This versatile open source project provides basic support for a wide range of document formats, including:
|
Document online preview project solution, built using the popular Spring Boot framework for easy setup and deployment. This versatile open source project provides basic support for a wide range of document formats, including:
|
||||||
|
|
||||||
1. Supports Office documents such as `doc`, `docx`, `xls`, `xlsx`, `xlsm`, `ppt`, `pptx`, `csv`, `tsv`, , `dotm`, `xlt`, `xltm`, `dot`, `xlam`, `dotx`, `xla,` ,`pages` etc.
|
1. Supports Office documents such as `doc`, `docx`, `xls`, `xlsx`, `xlsm`, `ppt`, `pptx`, `csv`, `tsv`, , `dotm`, `xlt`, `xltm`, `dot`, `xlam`, `dotx`, `xla,` ,`pages` ,`pptm` etc.
|
||||||
2. Supports domestic WPS Office documents such as `wps`, `dps`, `et` , `ett`, ` wpt`.
|
2. Supports domestic WPS Office documents such as `wps`, `dps`, `et` , `ett`, ` wpt`.
|
||||||
3. Supports OpenOffice, LibreOffice office documents such as `odt`, `ods`, `ots`, `odp`, `otp`, `six`, `ott`, `fodt` and `fods`.
|
3. Supports OpenOffice, LibreOffice office documents such as `odt`, `ods`, `ots`, `odp`, `otp`, `six`, `ott`, `fodt` and `fods`.
|
||||||
4. Supports Visio flowchart files such as `vsd`, `vsdx`.
|
4. Supports Visio flowchart files such as `vsd`, `vsdx`.
|
||||||
@@ -13,13 +13,13 @@ Document online preview project solution, built using the popular Spring Boot fr
|
|||||||
7. Supports document formats like `pdf`, `ofd`, and `rtf`.
|
7. Supports document formats like `pdf`, `ofd`, and `rtf`.
|
||||||
8. Supports software model files like `xmind`.
|
8. Supports software model files like `xmind`.
|
||||||
9. Support for `bpmn` workflow files.
|
9. Support for `bpmn` workflow files.
|
||||||
10. Support for `eml` mail files
|
10. Support for `eml` , `msg` mail files
|
||||||
11. Support for `epub` book documents
|
11. Support for `epub` book documents
|
||||||
12. Supports 3D model files like `obj`, `3ds`, `stl`, `ply`, `gltf`, `glb`, `off`, `3dm`, `fbx`, `dae`, `wrl`, `3mf`, `ifc`, `brep`, `step`, `iges`, `fcstd`, `bim`, etc.
|
12. Supports 3D model files like `obj`, `3ds`, `stl`, `ply`, `gltf`, `glb`, `off`, `3dm`, `fbx`, `dae`, `wrl`, `3mf`, `ifc`, `brep`, `step`, `iges`, `fcstd`, `bim`, etc.
|
||||||
13. Supports CAD model files such as `dwg`, `dxf`, `dwf` `iges` ,` igs`, `dwt` , `dng` , `ifc` , `dwfx` , `stl` , `cf2` , `plt`, etc.
|
13. Supports CAD model files such as `dwg`, `dxf`, `dwf` `iges` ,` igs`, `dwt` , `dng` , `ifc` , `dwfx` , `stl` , `cf2` , `plt`, etc.
|
||||||
14. Supports all plain text files such as `txt`, `xml` (rendering), `md` (rendering), `java`, `php`, `py`, `js`, `css`, etc.
|
14. Supports all plain text files such as `txt`, `xml` (rendering), `md` (rendering), `java`, `php`, `py`, `js`, `css`, etc.
|
||||||
15. Supports compressed packages such as `zip`, `rar`, `jar`, `tar`, `gzip`, `7z`, etc.
|
15. Supports compressed packages such as `zip`, `rar`, `jar`, `tar`, `gzip`, `7z`, etc.
|
||||||
16. Supports image previewing (flip, zoom, mirror) of `jpg`, `jpeg`, `png`, `gif`, `bmp`, `ico`, `jfif`, `webp`, etc.
|
16. Supports image previewing (flip, zoom, mirror) of `jpg`, `jpeg`, `png`, `gif`, `bmp`, `ico`, `jfif`, `webp`, `heic`, ,`heif` etc.
|
||||||
17. Supports image information model files such as `tif` and `tiff`.
|
17. Supports image information model files such as `tif` and `tiff`.
|
||||||
18. Supports image format files such as `tga`.
|
18. Supports image format files such as `tga`.
|
||||||
19. Supports vector image format files such as `svg`.
|
19. Supports vector image format files such as `svg`.
|
||||||
@@ -63,6 +63,174 @@ URL:[https://file.kkview.cn](https://file.kkview.cn)
|
|||||||
|
|
||||||
2. second step:Run the main method of `/server/src/main/java/cn/keking/ServerMain.java`. After starting,visit `http://localhost:8012/`.
|
2. second step:Run the main method of `/server/src/main/java/cn/keking/ServerMain.java`. After starting,visit `http://localhost:8012/`.
|
||||||
|
|
||||||
|
## Change History
|
||||||
|
|
||||||
|
### Version 5.0 (January 20, 2026)
|
||||||
|
|
||||||
|
#### Optimizations
|
||||||
|
1. Enhanced xlsx front-end parsing - Improved Excel file front-end rendering performance
|
||||||
|
2. Optimized image parsing - Enhanced image processing mechanism
|
||||||
|
3. Improved tif parsing - Enhanced TIF format support
|
||||||
|
4. Enhanced svg parsing - Optimized SVG vector image rendering
|
||||||
|
5. Improved json parsing - Enhanced JSON file processing
|
||||||
|
6. Optimized ftp multi-client access - Improved FTP service compatibility
|
||||||
|
7. Enhanced home page directory access - Implemented post server-side pagination mechanism
|
||||||
|
8. Improved marked parsing - Enhanced Markdown rendering
|
||||||
|
|
||||||
|
#### New Features
|
||||||
|
1. msg email parsing - Added support for msg format email file preview
|
||||||
|
2. heic image parsing - Added support for HEIC format image preview
|
||||||
|
3. Cross-domain methods - Added cross-domain processing mechanism
|
||||||
|
4. Highlighting methods - Added text highlighting functionality
|
||||||
|
5. Pagination methods - Added document page control
|
||||||
|
6. AES encryption methods - Added AES encryption support
|
||||||
|
7. Basic authentication methods - Added Basic authentication mechanism
|
||||||
|
8. Key management methods - Added key management functionality
|
||||||
|
9. Anti-duplicate conversion - Added duplicate file conversion protection
|
||||||
|
10. Async waiting - Added asynchronous processing mechanism
|
||||||
|
11. Upload restrictions - Added restrictions for unsupported file uploads
|
||||||
|
12. cadviewer conversion methods - Added CAD viewer conversion functionality
|
||||||
|
|
||||||
|
#### Fixed Issues
|
||||||
|
1. Compressed file path issues - Fixed internal path handling in compressed files
|
||||||
|
2. Security issues - Fixed security vulnerabilities
|
||||||
|
3. Incomplete image watermark issues - Fixed incomplete watermark display
|
||||||
|
4. SSL self-signed certificate access issues - Fixed compatibility with self-signed certificates
|
||||||
|
|
||||||
|
#### Updates
|
||||||
|
1. JDK version requirement - Mandatory requirement for JDK 21 or higher
|
||||||
|
2. pdf front-end parsing update - Upgraded PDF front-end rendering component
|
||||||
|
3. odf front-end parsing update - Upgraded ODF document front-end rendering
|
||||||
|
4. 3D model front-end parsing update - Upgraded 3D model viewer
|
||||||
|
5. pdf backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||||
|
6. tif backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||||
|
7. Video backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||||
|
8. CAD backend async conversion optimization - Implemented multi-threaded asynchronous conversion
|
||||||
|
|
||||||
|
### Version 4.4.0 (January 16, 2025)
|
||||||
|
|
||||||
|
#### New Features
|
||||||
|
1. xlsx printing support
|
||||||
|
2. Added GZIP compression enablement in configuration
|
||||||
|
3. CAD format now supports conversion to SVG and TIF formats, added timeout termination and thread management
|
||||||
|
4. Added captcha verification for file deletion
|
||||||
|
5. Added xbrl format preview support
|
||||||
|
6. PDF preview added control over signatures, drawings, illustration control, search positioning pagination, and display content definition
|
||||||
|
7. Added CSV format front-end parsing support
|
||||||
|
8. Added Docker image support for ARM64
|
||||||
|
9. Added Office preview conversion timeout property setting
|
||||||
|
10. Added preview file host blacklist mechanism
|
||||||
|
|
||||||
|
#### Optimizations
|
||||||
|
1. Optimized OFD mobile preview page adaptability
|
||||||
|
2. Updated xlsx front-end parsing component to accelerate parsing speed
|
||||||
|
3. Upgraded CAD component
|
||||||
|
4. Office function adjustments, supporting comments, conversion page limit, watermark generation, etc.
|
||||||
|
5. Upgraded markdown component
|
||||||
|
6. Upgraded dcm parsing component
|
||||||
|
7. Upgraded PDF.JS parsing component
|
||||||
|
8. Changed video player plugin to ckplayer
|
||||||
|
9. Smarter tif parsing, supporting modified image formats
|
||||||
|
10. Improved character encoding detection accuracy for large and small text files, handling concurrency vulnerabilities
|
||||||
|
11. Refactored file download code, added general file server authentication access design
|
||||||
|
12. Updated bootstrap component and streamlined unnecessary files
|
||||||
|
13. Updated epub version, optimized epub display effect
|
||||||
|
14. Fixed issue where scheduled cache cleanup only deleted disk cache files for multimedia file types
|
||||||
|
15. Auto-detection of installed Office components, added default paths for LibreOffice 7.5 & 7.6 versions
|
||||||
|
16. Changed drawio default to preview mode
|
||||||
|
17. Added PDF thread management, timeout management, memory cache management, updated PDF parsing component version
|
||||||
|
18. Optimized Dockerfile for true cross-platform image building
|
||||||
|
|
||||||
|
#### Fixes
|
||||||
|
1. Fixed forceUpdatedCache property setting issue where local cache files weren't updated
|
||||||
|
2. Fixed PDF decryption error after successful encrypted file conversion
|
||||||
|
3. Fixed BPMN cross-domain support issue
|
||||||
|
4. Fixed special character error in compressed package secondary reverse proxy
|
||||||
|
5. Fixed video cross-domain configuration causing video preview failure
|
||||||
|
6. Fixed TXT text pagination secondary loading issue
|
||||||
|
7. Fixed Drawio missing Base64 component issue
|
||||||
|
8. Fixed Markdown escaping issue
|
||||||
|
9. Fixed EPUB cross-domain error
|
||||||
|
10. Fixed URL special character issues
|
||||||
|
11. Fixed compressed package traversal vulnerability
|
||||||
|
12. Fixed compressed file path errors, image collection path errors, watermark issues, etc.
|
||||||
|
13. Fixed front-end parsing XLSX containing EMF format file errors
|
||||||
|
|
||||||
|
### Version 4.3.0 (July 5, 2023)
|
||||||
|
|
||||||
|
#### New Features
|
||||||
|
1. Added DCM medical digital imaging preview
|
||||||
|
2. Added drawio drawing preview
|
||||||
|
3. Added command to regenerate with cache enabled: &forceUpdatedCache=true
|
||||||
|
4. Added dwg CAD file preview
|
||||||
|
5. Added PDF file password support
|
||||||
|
6. Added DPI customization for PDF file image generation
|
||||||
|
7. Added configuration to delete converted OFFICE, CAD, TIFF, compressed package source files (enabled by default to save disk space)
|
||||||
|
8. Added front-end xlsx parsing method
|
||||||
|
9. Added support for pages, eps, iges, igs, dwt, dng, ifc, dwfx, stl, cf2, plt and other formats
|
||||||
|
|
||||||
|
#### Optimizations
|
||||||
|
1. Modified generated PDF file names to include file extensions to prevent duplicate names
|
||||||
|
2. Adjusted SQL file preview method
|
||||||
|
3. Optimized OFD preview compatibility
|
||||||
|
4. Beautified TXT text pagination box display
|
||||||
|
5. Upgraded Linux/Docker built-in office to LibreOffice-7.5.3
|
||||||
|
6. Upgraded Windows built-in office to LibreOffice-7.5.3 Portable
|
||||||
|
7. Other functional optimizations
|
||||||
|
|
||||||
|
#### Fixes
|
||||||
|
1. Fixed compressed package path errors in reverse proxy scenarios
|
||||||
|
2. Fixed .click error when image preview URLs contain &
|
||||||
|
3. Fixed known OFD preview issues
|
||||||
|
4. Fixed page error when clicking on file directories (tree nodes) in compressed package preview
|
||||||
|
5. Other known issue fixes
|
||||||
|
|
||||||
|
### Version 4.2.1 (April 18, 2023)
|
||||||
|
|
||||||
|
#### Change Log
|
||||||
|
1. Fixed null pointer bug in dwg file preview
|
||||||
|
|
||||||
|
### Version 4.2.0 (April 13, 2023)
|
||||||
|
|
||||||
|
#### New Features
|
||||||
|
1. Added SVG format file preview support
|
||||||
|
2. Added encrypted Office file preview support
|
||||||
|
3. Added encrypted zip, rar, and other compressed package file preview support
|
||||||
|
4. Added xmind software model file preview support
|
||||||
|
5. Added BPMN workflow model file preview support
|
||||||
|
6. Added eml email file preview support
|
||||||
|
7. Added EPUB e-book file preview support
|
||||||
|
8. Added office document format support: dotm, ett, xlt, xltm, wpt, dot, xlam, xla, dotx, etc.
|
||||||
|
9. Added 3D model file support: obj, 3ds, stl, ply, gltf, glb, off, 3dm, fbx, dae, wrl, 3mf, ifc, brep, step, iges, fcstd, bim, etc.
|
||||||
|
10. Added configurable high-risk file upload restrictions (e.g., exe files)
|
||||||
|
11. Added configurable site filing information
|
||||||
|
12. Added password requirement for demo site file deletion
|
||||||
|
|
||||||
|
#### Optimizations
|
||||||
|
1. Added caching for text document preview
|
||||||
|
2. Beautified 404, 500 error pages
|
||||||
|
3. Optimized invoice and other OFD file preview seal rendering compatibility
|
||||||
|
4. Removed office-plugin module, using new jodconverter component
|
||||||
|
5. Optimized Excel file preview effect
|
||||||
|
6. Optimized CAD file preview effect
|
||||||
|
7. Updated xstream, junrar, pdfbox, and other dependency versions
|
||||||
|
8. Updated TIF to PDF conversion plugin, added conversion cache
|
||||||
|
9. Optimized demo page UI deployment
|
||||||
|
10. Compressed package file preview supports directories
|
||||||
|
|
||||||
|
#### Fixes
|
||||||
|
1. Fixed XSS issues in some interfaces
|
||||||
|
2. Fixed console printed demo address not following content-path configuration
|
||||||
|
3. Fixed OFD file preview cross-domain issues
|
||||||
|
4. Fixed internal self-signed certificate HTTPS URL file download issues
|
||||||
|
5. Fixed special character file deletion issues
|
||||||
|
6. Fixed OOM caused by unreclaimed memory in PDF to image conversion
|
||||||
|
7. Fixed garbled preview for xlsx 7.4+ version files
|
||||||
|
8. Fixed TrustHostFilter not intercepting cross-domain interfaces (security issue - upgrade required if using TrustHost)
|
||||||
|
9. Fixed compressed package file preview filename garbled issue on Linux systems
|
||||||
|
10. Fixed OFD file preview only displaying 10 pages
|
||||||
|
|
||||||
|
|
||||||
### Changelog
|
### Changelog
|
||||||
> December 14, 2022, version 4.1.0 released:
|
> December 14, 2022, version 4.1.0 released:
|
||||||
|
|
||||||
|
|||||||
174
SECURITY_CONFIG.md
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
# kkFileView 安全配置指南
|
||||||
|
|
||||||
|
## ⚠️ 重要安全更新
|
||||||
|
|
||||||
|
从 4.4.0 之后版本开始,kkFileView 增强了安全性,默认拒绝所有未配置的外部文件预览请求,以防止 SSRF(服务器端请求伪造)攻击。
|
||||||
|
|
||||||
|
## 🔒 安全配置说明
|
||||||
|
|
||||||
|
### 1. 信任主机白名单配置(推荐)
|
||||||
|
|
||||||
|
在 `application.properties` 中配置允许预览的域名:
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# 方式1:通过配置文件
|
||||||
|
trust.host = kkview.cn,yourdomain.com,cdn.example.com
|
||||||
|
|
||||||
|
# 方式2:通过环境变量
|
||||||
|
KK_TRUST_HOST=kkview.cn,yourdomain.com,cdn.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**示例场景**:
|
||||||
|
- 只允许预览来自 `oss.aliyuncs.com` 和 `cdn.example.com` 的文件
|
||||||
|
```properties
|
||||||
|
trust.host = oss.aliyuncs.com,cdn.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 允许所有主机(不推荐,仅测试环境)
|
||||||
|
|
||||||
|
```properties
|
||||||
|
trust.host = *
|
||||||
|
```
|
||||||
|
|
||||||
|
⚠️ **警告**:此配置会允许访问任意外部地址,存在安全风险,仅应在测试环境使用!
|
||||||
|
|
||||||
|
### 3. 黑名单配置(高级)
|
||||||
|
|
||||||
|
禁止特定域名或内网地址:
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# 禁止访问内网地址(强烈推荐)
|
||||||
|
not.trust.host = localhost,127.0.0.1,192.168.*,10.*,172.16.*,169.254.*
|
||||||
|
|
||||||
|
# 禁止特定恶意域名
|
||||||
|
not.trust.host = malicious-site.com,spam-domain.net
|
||||||
|
```
|
||||||
|
|
||||||
|
**优先级**:黑名单 > 白名单
|
||||||
|
|
||||||
|
### 4. Docker 环境配置
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -d \
|
||||||
|
-e KK_TRUST_HOST=yourdomain.com,cdn.example.com \
|
||||||
|
-e KK_NOT_TRUST_HOST=localhost,127.0.0.1 \
|
||||||
|
-p 8012:8012 \
|
||||||
|
keking/kkfileview:4.4.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🛡️ 安全最佳实践
|
||||||
|
|
||||||
|
### ✅ 推荐配置
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# 1. 明确配置信任主机白名单
|
||||||
|
trust.host = your-cdn.com,your-storage.com
|
||||||
|
|
||||||
|
# 2. 配置黑名单防止内网访问
|
||||||
|
not.trust.host = localhost,127.0.0.1,192.168.*,10.*,172.16.*
|
||||||
|
|
||||||
|
# 3. 禁用文件上传(生产环境)
|
||||||
|
file.upload.disable = true
|
||||||
|
|
||||||
|
# 4. 配置基础URL(使用反向代理时)
|
||||||
|
base.url = https://preview.yourdomain.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### ❌ 不推荐配置
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# 危险:允许所有主机访问
|
||||||
|
trust.host = *
|
||||||
|
|
||||||
|
# 危险:启用文件上传(生产环境)
|
||||||
|
file.upload.disable = false
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔍 配置验证
|
||||||
|
|
||||||
|
### 测试白名单是否生效
|
||||||
|
|
||||||
|
1. 配置白名单:
|
||||||
|
```properties
|
||||||
|
trust.host = kkview.cn
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 尝试预览白名单内的文件:
|
||||||
|
```
|
||||||
|
http://localhost:8012/onlinePreview?url=https://kkview.cn/test.pdf
|
||||||
|
✅ 应该可以正常预览
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 尝试预览白名单外的文件:
|
||||||
|
```
|
||||||
|
http://localhost:8012/onlinePreview?url=https://other-domain.com/test.pdf
|
||||||
|
❌ 应该被拒绝,显示"不信任的文件源"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 测试黑名单是否生效
|
||||||
|
|
||||||
|
1. 配置黑名单:
|
||||||
|
```properties
|
||||||
|
not.trust.host = localhost,127.0.0.1
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 尝试访问本地文件:
|
||||||
|
```
|
||||||
|
http://localhost:8012/getCorsFile?urlPath=http://127.0.0.1:8080/admin
|
||||||
|
❌ 应该被拒绝
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📋 常见问题
|
||||||
|
|
||||||
|
### Q1: 升级后无法预览文件了?
|
||||||
|
|
||||||
|
**原因**:新版本默认拒绝未配置的主机。
|
||||||
|
|
||||||
|
**解决**:在配置文件中添加信任主机列表:
|
||||||
|
```properties
|
||||||
|
trust.host = your-file-server.com
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q2: 如何临时恢复旧版本行为?
|
||||||
|
|
||||||
|
**不推荐**,但如果确实需要:
|
||||||
|
```properties
|
||||||
|
trust.host = *
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q3: 配置了白名单但还是无法访问?
|
||||||
|
|
||||||
|
检查以下几点:
|
||||||
|
1. 域名是否完全匹配(区分大小写)
|
||||||
|
2. 是否配置了黑名单,黑名单优先级更高
|
||||||
|
3. 查看日志中的 WARNING 信息
|
||||||
|
4. 确认环境变量是否正确设置
|
||||||
|
|
||||||
|
### Q4: 如何允许子域名?
|
||||||
|
|
||||||
|
已支持通配符域名匹配,可使用 `*.example.com`:
|
||||||
|
```properties
|
||||||
|
trust.host = *.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:
|
||||||
|
- `*.example.com` 会匹配 `cdn.example.com`、`api.internal.example.com`,但不匹配根域 `example.com`
|
||||||
|
- 对于 IP 风格通配(如 `192.168.*`、`10.*`),仅匹配字面量 IPv4 地址,不匹配域名
|
||||||
|
|
||||||
|
## 🚨 安全事件响应
|
||||||
|
|
||||||
|
如果发现可疑的预览请求:
|
||||||
|
|
||||||
|
1. 检查日志文件,搜索 "拒绝访问主机" 关键字
|
||||||
|
2. 确认 `trust.host` 配置是否合理
|
||||||
|
3. 检查是否有异常的网络请求
|
||||||
|
4. 如发现攻击行为,及时更新黑名单配置
|
||||||
|
|
||||||
|
## 📞 获取帮助
|
||||||
|
|
||||||
|
- GitHub Issues: https://github.com/kekingcn/kkFileView/issues
|
||||||
|
- Gitee Issues: https://gitee.com/kekingcn/file-online-preview/issues
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**安全提示**:定期检查和更新信任主机列表,遵循最小权限原则。
|
||||||
41
doc/ci-auto-deploy.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# kkFileView master 自动部署
|
||||||
|
|
||||||
|
当前线上 Windows 服务器的实际部署信息如下:
|
||||||
|
|
||||||
|
- 部署根目录:`C:\kkFileView-5.0`
|
||||||
|
- 运行 jar:`C:\kkFileView-5.0\bin\kkFileView-5.0.jar`
|
||||||
|
- 启动脚本:`C:\kkFileView-5.0\bin\startup.bat`
|
||||||
|
- 运行配置:`C:\kkFileView-5.0\config\test.properties`
|
||||||
|
- 健康检查地址:`http://127.0.0.1:8012/`
|
||||||
|
|
||||||
|
服务器当前没有安装 `git` 和 `mvn`,因此自动部署链路采用:
|
||||||
|
|
||||||
|
1. GitHub Actions 在 `master` 合并后构建 `kkFileView-*.jar`
|
||||||
|
2. 通过 WinRM 连接 Windows 服务器
|
||||||
|
3. 由服务器从当前 workflow run 下载 jar artifact
|
||||||
|
4. 备份线上 jar,替换为新版本
|
||||||
|
5. 使用现有 `startup.bat` 重启,并做健康检查
|
||||||
|
6. 如果健康检查失败,则自动回滚旧 jar 并重新拉起
|
||||||
|
|
||||||
|
## 需要配置的 GitHub Secrets
|
||||||
|
|
||||||
|
- `KK_DEPLOY_HOST`
|
||||||
|
- `KK_DEPLOY_ARTIFACT_TOKEN`
|
||||||
|
- `KK_DEPLOY_USERNAME`
|
||||||
|
- `KK_DEPLOY_PASSWORD`
|
||||||
|
|
||||||
|
下面这些可以不配,未配置时会使用默认值:
|
||||||
|
|
||||||
|
- `KK_DEPLOY_PORT=5985`
|
||||||
|
- `KK_DEPLOY_ROOT=C:\kkFileView-5.0`
|
||||||
|
- `KK_DEPLOY_HEALTH_URL=http://127.0.0.1:8012/`
|
||||||
|
|
||||||
|
其中 `KK_DEPLOY_ARTIFACT_TOKEN` 建议使用单独的细粒度 token,只授予当前仓库所需的最小读取权限,不要复用默认 `GITHUB_TOKEN` 到生产服务器。
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
新增 workflow:`.github/workflows/master-auto-deploy.yml`
|
||||||
|
|
||||||
|
- 触发条件:`push` 到 `master`,或手动 `workflow_dispatch`
|
||||||
|
- 构建产物:`kkfileview-server-jar`
|
||||||
|
- 部署方式:WinRM + GitHub Actions artifact 下载
|
||||||
44
doc/e2e-improvement-checklist.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# E2E 完善清单(基于 PR342 回归经验)
|
||||||
|
|
||||||
|
## 背景
|
||||||
|
本次手工回归已经验证了以下关键链路:
|
||||||
|
- TXT
|
||||||
|
- XLSX
|
||||||
|
- ZIP
|
||||||
|
- PDF
|
||||||
|
- DOCX
|
||||||
|
- MP4
|
||||||
|
- CAD / DXF
|
||||||
|
|
||||||
|
但当前 GitHub CI 中,自动化 E2E 仅覆盖了其中一部分,且大多只断言 HTTP 200,没有校验最终预览效果。
|
||||||
|
|
||||||
|
## 本次落地目标
|
||||||
|
|
||||||
|
### 1. 补齐缺失的关键链路
|
||||||
|
- [x] PDF 预览 smoke
|
||||||
|
- [x] MP4 预览 smoke
|
||||||
|
- [x] CAD / DXF 预览 smoke
|
||||||
|
|
||||||
|
### 2. 升级断言方式
|
||||||
|
- [x] 不再只看 `status === 200`
|
||||||
|
- [x] 增加标题/页面关键字断言,确认命中了正确预览模板
|
||||||
|
- [x] 对 PDF / DOCX / CAD 增加“等待页 -> 最终页面”的轮询兼容
|
||||||
|
|
||||||
|
### 3. 补齐 CI 所需 fixture
|
||||||
|
- [x] `sample.pdf` 进入 required fixture 清单
|
||||||
|
- [x] `sample.mp4` 进入 required fixture 清单
|
||||||
|
- [x] `text.dxf` 进入 required fixture 清单
|
||||||
|
- [x] 将 MP4 与 DXF fixture 作为仓库内静态样例纳入 CI
|
||||||
|
|
||||||
|
### 4. 后续可继续增强(本次未全部落地)
|
||||||
|
- [ ] 为 PDF / Office / CAD 增加截图型 nightly artifact
|
||||||
|
- [ ] 为 `/picturesPreview` 增加独立 smoke
|
||||||
|
- [ ] 为 OFD 增加稳定 fixture 和 smoke case
|
||||||
|
- [ ] 为媒体预览增加更多格式(如 wav / mp3 / mov)
|
||||||
|
- [ ] 为 CAD 增加第二份标准样例,避免单样例偏差
|
||||||
|
- [ ] 将当前 HTML 测试报告模板收敛成 nightly 自动产物
|
||||||
|
|
||||||
|
## 预期收益
|
||||||
|
- 让 CI 覆盖这次 PR342 真正验证过的关键主链路
|
||||||
|
- 避免未来出现“CI 绿了,但 PDF / MP4 / CAD 实际挂了”的情况
|
||||||
|
- 让 E2E 更接近用户真实感知,而不是仅验证接口可达
|
||||||
BIN
doc/img/preview/preview-3ds.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
doc/img/preview/preview-audio.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
doc/img/preview/preview-bpmn.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
doc/img/preview/preview-cad-image.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
doc/img/preview/preview-cad-pdf.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
doc/img/preview/preview-dcm.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
doc/img/preview/preview-doc-image.png
Normal file
|
After Width: | Height: | Size: 159 KiB |
BIN
doc/img/preview/preview-doc-pdf.png
Normal file
|
After Width: | Height: | Size: 219 KiB |
BIN
doc/img/preview/preview-drawio.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
doc/img/preview/preview-image.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
doc/img/preview/preview-pdf-image.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
BIN
doc/img/preview/preview-pdf-pdf.png
Normal file
|
After Width: | Height: | Size: 254 KiB |
BIN
doc/img/preview/preview-ppt-image.png
Normal file
|
After Width: | Height: | Size: 392 KiB |
BIN
doc/img/preview/preview-ppt-pdf.png
Normal file
|
After Width: | Height: | Size: 211 KiB |
BIN
doc/img/preview/preview-text.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
doc/img/preview/preview-video.png
Normal file
|
After Width: | Height: | Size: 469 KiB |
BIN
doc/img/preview/preview-xls.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
doc/img/preview/preview-xlsx-web.png
Normal file
|
After Width: | Height: | Size: 166 KiB |
BIN
doc/img/preview/preview-xmind.png
Normal file
|
After Width: | Height: | Size: 252 KiB |
BIN
doc/img/preview/preview-zip-inner.png
Normal file
|
After Width: | Height: | Size: 236 KiB |
BIN
doc/img/preview/preview-zip.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
28
docker/kkfileview-base/Dockerfile
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
RUN sed -i 's@//.*archive.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\
|
||||||
|
sed -i 's@//security.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\
|
||||||
|
sed -i 's@//ports.ubuntu.com@//mirrors.aliyun.com@g' /etc/apt/sources.list.d/ubuntu.sources &&\
|
||||||
|
apt-get update &&\
|
||||||
|
export DEBIAN_FRONTEND=noninteractive &&\
|
||||||
|
apt-get install -y --no-install-recommends openjdk-21-jre tzdata locales xfonts-utils fontconfig libreoffice-nogui &&\
|
||||||
|
echo 'Asia/Shanghai' > /etc/timezone &&\
|
||||||
|
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
|
||||||
|
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 &&\
|
||||||
|
locale-gen zh_CN.UTF-8 &&\
|
||||||
|
apt-get install -y --no-install-recommends ttf-mscorefonts-installer &&\
|
||||||
|
apt-get install -y --no-install-recommends ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\
|
||||||
|
apt-get autoremove -y &&\
|
||||||
|
apt-get clean &&\
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# 内置一些常用的中文字体,避免普遍性乱码
|
||||||
|
ADD fonts/* /usr/share/fonts/chinese/
|
||||||
|
|
||||||
|
RUN cd /usr/share/fonts/chinese &&\
|
||||||
|
# 安装字体
|
||||||
|
mkfontscale &&\
|
||||||
|
mkfontdir &&\
|
||||||
|
fc-cache -fv
|
||||||
|
|
||||||
|
ENV LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
|
||||||
50
docker/kkfileview-base/README.cn.md
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# 构建说明
|
||||||
|
|
||||||
|
由于 kkfileview 的基础运行环境很少变动且制作耗时较久,而 kkfileview 本身代码开发会频繁改动,因此把制作其 Docker 镜像的步骤拆分为两次:
|
||||||
|
|
||||||
|
首先制作 kkfileview 的基础镜像(kkfileview-base)。
|
||||||
|
|
||||||
|
然后使用 kkfileview-base 作为基础镜像进行构建,加快 kkfileview docker 镜像构建与发布。
|
||||||
|
|
||||||
|
执行如下命令即可构建基础镜像:
|
||||||
|
> 这里镜像 tag 以 4.4.0 为例,本项目所维护的 Dockerfile 文件考虑了跨平台兼容性。 如果你需要用到 arm64 架构镜像, 则在arm64 架构机器上同样执行下面的构建命令即可
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker build --tag keking/kkfileview-base:4.4.0 .
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 跨平台构建
|
||||||
|
|
||||||
|
`docker buildx` 支持在一台机器上构建出多种平台架构的镜像。推荐使用该能力进行跨平台的镜像构建。
|
||||||
|
例如,执行 `docker buildx build` 命令时加上 `--platform=linux/arm64` 参数即可构建出 arm64 架构镜像。这极大方便了那些没有arm64 架构机器却想构建 arm64 架构镜像的用户。
|
||||||
|
|
||||||
|
> 当前本项目仅支持构建 linux/amd64 和 linux/arm64 两种平台架构的镜像
|
||||||
|
> buildx 的 builder driver 可以使用默认的 `docker` 类型, 若使用 `docker-container` 类型可以支持并行构建多种架构, 本文不再赘述, 有兴趣可以自行了解。参考 [Docker Buildx | Docker Documentation](https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images)
|
||||||
|
|
||||||
|
**前提要求**
|
||||||
|
|
||||||
|
以当前机器为 amd64 (x86_64)架构为例。需要开启 docker 的 buildx 特性,以及开启 Linux 的 QEMU 用户模式:
|
||||||
|
|
||||||
|
> 使用 WSL2 的 Windows 用户如果安装了最新的 DockerDesktop, 则这些前提要求已满足, 无需额外下述设置。
|
||||||
|
|
||||||
|
1. 安装 docker buildx 客户端插件:
|
||||||
|
> docker 版本要求 >=19.03
|
||||||
|
|
||||||
|
若已安装, 则跳过。详情参考 https://github.com/docker/buildx
|
||||||
|
|
||||||
|
2. 开启 QEMU 的用户模式功能, 并安装其它平台的模拟器:
|
||||||
|
> Linux 内核要求 >=4.8
|
||||||
|
|
||||||
|
使用 `tonistiigi/binfmt` 镜像可快速开启并安装模拟器,执行下面命令:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
```
|
||||||
|
|
||||||
|
现在就可以愉快地开始构建了,构建命令示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker buildx build --platform=linux/amd64,linux/arm64 -t keking/kkfileview-base:4.4.0 --push .
|
||||||
|
```
|
||||||
53
docker/kkfileview-base/README.md
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
# Build Instructions
|
||||||
|
|
||||||
|
Since the base runtime environment for kkfileview rarely changes and takes a long time to build, while the kkfileview code itself is frequently updated, the process of building its Docker image is split into two steps:
|
||||||
|
|
||||||
|
First, create the base image for kkfileview (kkfileview-base).
|
||||||
|
|
||||||
|
Then, use kkfileview-base as the base image to build and speed up the kkfileview Docker image build and release process.
|
||||||
|
|
||||||
|
To build the base image, run the following command:
|
||||||
|
|
||||||
|
> In this example, the image tag is 4.4.0. The Dockerfile maintained in this project considers cross-platform compatibility. If you need an arm64 architecture image, run the same build command on an arm64 architecture machine.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker build --tag keking/kkfileview-base:4.4.0 .
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Cross-Platform Build
|
||||||
|
|
||||||
|
`docker buildx` supports building images for multiple platform architectures on a single machine. It is recommended to use this capability for cross-platform image builds.
|
||||||
|
For example, adding the `--platform=linux/arm64` parameter when executing the `docker buildx build` command will allow you to build an arm64 architecture image. This is particularly convenient for users who want to build arm64 images but don't have an arm64 machine.
|
||||||
|
|
||||||
|
> Currently, this project only supports building images for the linux/amd64 and linux/arm64 architectures.
|
||||||
|
> The buildx builder driver can use the default `docker` type, but if you use the `docker-container` type, you can build multiple architectures in parallel. This README will not cover that in detail, you can learn more on your own. Refer to [Docker Buildx | Docker Documentation](https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images)
|
||||||
|
|
||||||
|
**Prerequisites**
|
||||||
|
|
||||||
|
Assuming the current machine is amd64 (x86_64) architecture, you'll need to enable the docker buildx feature and enable Linux QEMU user mode:
|
||||||
|
|
||||||
|
> Windows users with WSL2 who have installed a recent version of Docker Desktop will already meet these prerequisites, so no additional setup is required.
|
||||||
|
|
||||||
|
1. Install the docker buildx client plugin:
|
||||||
|
|
||||||
|
> Docker version >=19.03 is required.
|
||||||
|
|
||||||
|
If it's already installed, you can skip this step. For more details, refer to https://github.com/docker/buildx.
|
||||||
|
|
||||||
|
2. Enable QEMU user mode and install emulators for other platforms:
|
||||||
|
|
||||||
|
> Linux kernel version >=4.8 is required.
|
||||||
|
|
||||||
|
You can quickly enable and install emulators using the tonistiigi/binfmt image by running the following command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker run --privileged --rm tonistiigi/binfmt --install all
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can enjoy the building. Here’s an example build command:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
docker buildx build --platform=linux/amd64,linux/arm64 -t keking/kkfileview-base:4.4.0 --push .
|
||||||
|
```
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
FROM ubuntu:20.04
|
|
||||||
MAINTAINER chenjh "842761733@qq.com"
|
|
||||||
# 内置一些常用的中文字体,避免普遍性乱码
|
|
||||||
COPY fonts/* /usr/share/fonts/chinese/
|
|
||||||
RUN apt-get clean && apt-get update &&\
|
|
||||||
sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list &&\
|
|
||||||
sed -i 's/# deb/deb/g' /etc/apt/sources.list &&\
|
|
||||||
apt-get install -y --reinstall ca-certificates &&\
|
|
||||||
apt-get clean && apt-get update &&\
|
|
||||||
apt-get install -y locales language-pack-zh-hans &&\
|
|
||||||
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 && locale-gen zh_CN.UTF-8 &&\
|
|
||||||
export DEBIAN_FRONTEND=noninteractive &&\
|
|
||||||
apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
|
|
||||||
apt-get install -y fontconfig ttf-mscorefonts-installer ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\
|
|
||||||
apt-get install -y wget &&\
|
|
||||||
cd /tmp &&\
|
|
||||||
wget https://kkview.cn/resource/server-jre-8u251-linux-x64.tar.gz &&\
|
|
||||||
tar -zxf /tmp/server-jre-8u251-linux-x64.tar.gz && mv /tmp/jdk1.8.0_251 /usr/local/ &&\
|
|
||||||
|
|
||||||
# 安装 libreoffice
|
|
||||||
apt-get install -y libxrender1 libxinerama1 libxt6 libxext-dev libfreetype6-dev libcairo2 libcups2 libx11-xcb1 libnss3 &&\
|
|
||||||
wget https://downloadarchive.documentfoundation.org/libreoffice/old/7.5.3.2/deb/x86_64/LibreOffice_7.5.3.2_Linux_x86-64_deb.tar.gz -cO libreoffice_deb.tar.gz &&\
|
|
||||||
tar -zxf /tmp/libreoffice_deb.tar.gz && cd /tmp/LibreOffice_7.5.3.2_Linux_x86-64_deb/DEBS &&\
|
|
||||||
dpkg -i *.deb &&\
|
|
||||||
|
|
||||||
# 清理临时文件
|
|
||||||
rm -rf /tmp/* && rm -rf /var/lib/apt/lists/* &&\
|
|
||||||
cd /usr/share/fonts/chinese &&\
|
|
||||||
mkfontscale &&\
|
|
||||||
mkfontdir &&\
|
|
||||||
fc-cache -fv
|
|
||||||
|
|
||||||
ENV JAVA_HOME /usr/local/jdk1.8.0_251
|
|
||||||
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
|
|
||||||
ENV PATH $PATH:$JAVA_HOME/bin
|
|
||||||
ENV LANG zh_CN.UTF-8
|
|
||||||
ENV LC_ALL zh_CN.UTF-8
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
FROM arm64v8/ubuntu:20.04
|
|
||||||
MAINTAINER chenjh "842761733@qq.com"
|
|
||||||
# 内置一些常用的中文字体,避免普遍性乱码
|
|
||||||
COPY fonts/* /usr/share/fonts/chinese/
|
|
||||||
RUN apt-get clean && apt-get update &&\
|
|
||||||
sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list &&\
|
|
||||||
sed -i 's/# deb/deb/g' /etc/apt/sources.list &&\
|
|
||||||
apt-get install -y --reinstall ca-certificates &&\
|
|
||||||
apt-get clean && apt-get update &&\
|
|
||||||
apt-get install -y locales language-pack-zh-hans &&\
|
|
||||||
localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8 && locale-gen zh_CN.UTF-8 &&\
|
|
||||||
export DEBIAN_FRONTEND=noninteractive &&\
|
|
||||||
apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\
|
|
||||||
apt-get install -y fontconfig ttf-mscorefonts-installer ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy &&\
|
|
||||||
apt-get install -y wget
|
|
||||||
# 安装 arm64-jre8
|
|
||||||
RUN apt-get install -y openjdk-8-jre
|
|
||||||
# 编译 libreoffice
|
|
||||||
RUN apt-get install -y git build-essential zip ccache junit4 libkrb5-dev nasm graphviz python3 python3-dev qtbase5-dev libkf5coreaddons-dev libkf5i18n-dev libkf5config-dev libkf5windowsystem-dev libkf5kio-dev autoconf libcups2-dev libfontconfig1-dev gperf default-jdk doxygen libxslt1-dev xsltproc libxml2-utils libxrandr-dev libx11-dev bison flex libgtk-3-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev ant ant-optional libnss3-dev libavahi-client-dev libxt-dev &&\
|
|
||||||
# 安装 ccache(重复编译时加快速度)
|
|
||||||
apt-get install ccache &&\
|
|
||||||
ccache -M 10G &&\
|
|
||||||
# clone主代码
|
|
||||||
mkdir /opt/libreoffice
|
|
||||||
WORKDIR /opt/libreoffice
|
|
||||||
RUN git clone --depth=1 --branch libreoffice-7-5 git://go.suokunlong.cn/lo/core ./libreoffice-7-5
|
|
||||||
# 配置&抓取子模块
|
|
||||||
WORKDIR /opt/libreoffice/libreoffice-7-5
|
|
||||||
RUN git submodule init &&\
|
|
||||||
git config --unset-all submodule.dictionaries.active &&\
|
|
||||||
git config --unset-all submodule.dictionaries.url &&\
|
|
||||||
git config --unset-all submodule.helpcontent2.active &&\
|
|
||||||
git config --unset-all submodule.helpcontent2.url &&\
|
|
||||||
git submodule update --progress --depth=1 &&\
|
|
||||||
# 下载第三方依赖
|
|
||||||
mkdir -p /opt/libreoffice/ext &&\
|
|
||||||
wget --recursive --no-parent --no-check-certificate -P /opt/libreoffice/ext https://go.suokunlong.cn:88/dl/libreoffice/external_tarballs/
|
|
||||||
RUN mv /opt/libreoffice/ext/go.suokunlong.cn:88/dl/libreoffice/external_tarballs/* /opt/libreoffice/ext
|
|
||||||
# 配置编译选项
|
|
||||||
RUN cat << EOF > autogen.input \
|
|
||||||
&& echo "--without-help" >> autogen.input \
|
|
||||||
&& echo "--without-helppack-integration" >> autogen.input \
|
|
||||||
&& echo "--with-lang=zh-CN zh-TW" >> autogen.input \
|
|
||||||
&& echo "--disable-online-update" >> autogen.input \
|
|
||||||
&& echo "--disable-breakpad" >> autogen.input \
|
|
||||||
&& echo "--disable-odk" >> autogen.input \
|
|
||||||
&& echo "--without-doxygen" >> autogen.input \
|
|
||||||
&& echo "--with-external-tar=/opt/libreoffice/ext" >> autogen.input \
|
|
||||||
&& echo "--without-java" >> autogen.input \
|
|
||||||
&& echo "--enable-firebird-sdbc" >> autogen.input \
|
|
||||||
&& echo "--without-system-firebird" >> autogen.input \
|
|
||||||
&& echo "--enable-python=internal" >> autogen.input
|
|
||||||
# 预编译
|
|
||||||
RUN ./autogen.sh
|
|
||||||
# 因为libreoffice的安全策略,不允许root用户执行编译操作(可以改Makefile文件解决),所以新建用户
|
|
||||||
RUN useradd libreoffice
|
|
||||||
# 切换用户
|
|
||||||
RUN su libreoffice
|
|
||||||
# 在普通用户下编译
|
|
||||||
RUN make || true
|
|
||||||
# !!!编译40分钟左右会报错,此时需要执行以下操作重新编译
|
|
||||||
RUN cp ./workdir/UnpackedTarball/python3/build/lib.linux-aarch64-3.8/_sysconfigdata__linux_aarch64-linux-gnu.py ./workdir/UnpackedTarball/python3/build/lib.linux-aarch64-3.8/_sysconfigdata__linux_aarch64-unknown-linux-gnu.py
|
|
||||||
# 重新编译
|
|
||||||
RUN make &&\
|
|
||||||
make install
|
|
||||||
|
|
||||||
RUN ln -s /usr/local/lib/libreoffice/program/soffice /usr/bin/libreoffice
|
|
||||||
|
|
||||||
# 清理临时文件
|
|
||||||
RUN rm -rf /tmp/* && rm -rf /var/lib/apt/lists/* &&\
|
|
||||||
cd /usr/share/fonts/chinese &&\
|
|
||||||
mkfontscale &&\
|
|
||||||
mkfontdir &&\
|
|
||||||
fc-cache -fv
|
|
||||||
ENV LANG zh_CN.UTF-8
|
|
||||||
ENV LC_ALL zh_CN.UTF-8
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# 执行如下命令构建基础镜像,加快kkfileview docker镜像构建与发布
|
|
||||||
docker build --tag keking/kkfileview-jdk:4.3.0 .
|
|
||||||
|
|
||||||
# arm64架构执行如下命令
|
|
||||||
docker build -f Dockerfile_arm64 --tag keking/kkfileview-jdk:4.3.0 .
|
|
||||||
95
pom.xml
@@ -6,53 +6,75 @@
|
|||||||
|
|
||||||
<groupId>cn.keking</groupId>
|
<groupId>cn.keking</groupId>
|
||||||
<artifactId>kkFileView-parent</artifactId>
|
<artifactId>kkFileView-parent</artifactId>
|
||||||
<version>4.4.0-beta</version>
|
<version>5.0</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<java.version>1.8</java.version>
|
<!-- ========== Java 和编译配置 ========== -->
|
||||||
<jodconverter.version>4.4.6</jodconverter.version>
|
<java.version>21</java.version>
|
||||||
<spring.boot.version>2.4.2</spring.boot.version>
|
|
||||||
<poi.version>5.2.2</poi.version>
|
|
||||||
<xdocreport.version>1.0.6</xdocreport.version>
|
|
||||||
<xstream.version>1.4.20</xstream.version>
|
|
||||||
<junrar.version>7.5.5</junrar.version>
|
|
||||||
<redisson.version>3.2.0</redisson.version>
|
|
||||||
<sevenzipjbinding.version>16.02-2.01</sevenzipjbinding.version>
|
|
||||||
<jchardet.version>1.0</jchardet.version>
|
|
||||||
<antlr.version>2.7.7</antlr.version>
|
|
||||||
<concurrentlinkedhashmap.version>1.4.2</concurrentlinkedhashmap.version>
|
|
||||||
<rocksdb.version>5.17.2</rocksdb.version>
|
|
||||||
<pdfbox.version>2.0.29</pdfbox.version>
|
|
||||||
<jai-imageio.version>1.4.0</jai-imageio.version>
|
|
||||||
<jbig2-imageio.version>3.0.4</jbig2-imageio.version>
|
|
||||||
<galimatias.version>0.2.1</galimatias.version>
|
|
||||||
<bytedeco.version>1.5.2</bytedeco.version>
|
|
||||||
<opencv.version>4.1.2-1.5.2</opencv.version>
|
|
||||||
<openblas.version>0.3.6-1.5.1</openblas.version>
|
|
||||||
<ffmpeg.version>4.2.1-1.5.2</ffmpeg.version>
|
|
||||||
<itextpdf.version>5.5.13.3</itextpdf.version>
|
|
||||||
<httpclient.version>3.1</httpclient.version>
|
|
||||||
<aspose-cad.version>23.9</aspose-cad.version>
|
|
||||||
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
|
|
||||||
<juniversalchardet.version>1.0.3</juniversalchardet.version>
|
|
||||||
<httpcomponents.version>4.5.14</httpcomponents.version>
|
|
||||||
|
|
||||||
<commons-cli.version>1.5.0</commons-cli.version>
|
|
||||||
<commons-net.version>3.9.0</commons-net.version>
|
|
||||||
<commons-lang3.version>3.13.0</commons-lang3.version>
|
|
||||||
|
|
||||||
|
|
||||||
<maven.compiler.source>${java.version}</maven.compiler.source>
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
|
<maven.compiler.release>${java.version}</maven.compiler.release>
|
||||||
<maven.compiler.target>${java.version}</maven.compiler.target>
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
|
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
|
<!-- ========== Spring 框架 ========== -->
|
||||||
|
<spring.boot.version>3.5.6</spring.boot.version>
|
||||||
|
|
||||||
|
<!-- ========== 文档转换和Office处理 ========== -->
|
||||||
|
<jodconverter.version>4.4.11</jodconverter.version>
|
||||||
|
<poi.version>5.2.5</poi.version>
|
||||||
|
<xdocreport.version>1.0.6</xdocreport.version>
|
||||||
|
<aspose-cad.version>25.10</aspose-cad.version>
|
||||||
|
|
||||||
|
<!-- ========== PDF 处理 ========== -->
|
||||||
|
<pdfbox.version>3.0.6</pdfbox.version>
|
||||||
|
|
||||||
|
<!-- ========== 图像处理 ========== -->
|
||||||
|
<jai-imageio.version>1.4.0</jai-imageio.version>
|
||||||
|
<jbig2-imageio.version>3.0.4</jbig2-imageio.version>
|
||||||
|
<commons-imaging.version>1.0.0-alpha6</commons-imaging.version>
|
||||||
|
|
||||||
|
<!-- ========== 视频处理 (JavaCV) ========== -->
|
||||||
|
<bytedeco.version>1.5.12</bytedeco.version>
|
||||||
|
<opencv.version>4.11.0-1.5.12</opencv.version>
|
||||||
|
<openblas.version>0.3.30-1.5.12</openblas.version>
|
||||||
|
<ffmpeg.version>7.1.1-1.5.12</ffmpeg.version>
|
||||||
|
|
||||||
|
<!-- ========== 压缩文件处理 ========== -->
|
||||||
|
<sevenzipjbinding.version>16.02-2.01</sevenzipjbinding.version>
|
||||||
|
<junrar.version>7.5.5</junrar.version>
|
||||||
|
|
||||||
|
<!-- ========== 缓存和存储 ========== -->
|
||||||
|
<redisson.version>4.0.0</redisson.version>
|
||||||
|
<rocksdb.version>5.17.2</rocksdb.version>
|
||||||
|
<concurrentlinkedhashmap.version>1.4.2</concurrentlinkedhashmap.version>
|
||||||
|
|
||||||
|
<!-- ========== 网络通信 ========== -->
|
||||||
|
<httpcomponents.version>4.5.16</httpcomponents.version>
|
||||||
|
<commons-net.version>3.12.0</commons-net.version>
|
||||||
|
|
||||||
|
<!-- ========== Apache Commons 工具库 ========== -->
|
||||||
|
<commons-lang3.version>3.20.0</commons-lang3.version>
|
||||||
|
<commons-cli.version>1.11.0</commons-cli.version>
|
||||||
|
|
||||||
|
<!-- ========== 编码和字符处理 ========== -->
|
||||||
|
<juniversalchardet.version>1.0.3</juniversalchardet.version>
|
||||||
|
<jchardet.version>1.0</jchardet.version>
|
||||||
|
|
||||||
|
<!-- ========== 安全相关 ========== -->
|
||||||
|
<bcprov-jdk15on.version>1.70</bcprov-jdk15on.version>
|
||||||
|
|
||||||
|
<!-- ========== 其他工具库 ========== -->
|
||||||
|
<xstream.version>1.4.21</xstream.version>
|
||||||
|
<antlr.version>2.7.7</antlr.version>
|
||||||
|
<galimatias.version>0.2.1</galimatias.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>server</module>
|
<module>server</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
|
<!-- ========== 项目信息 ========== -->
|
||||||
<name>kkFileView-parent</name>
|
<name>kkFileView-parent</name>
|
||||||
<description>专注文件在线预览服务</description>
|
<description>专注文件在线预览服务</description>
|
||||||
<url>https://github.com/kekingcn/kkFileView</url>
|
<url>https://github.com/kekingcn/kkFileView</url>
|
||||||
@@ -88,5 +110,4 @@
|
|||||||
<system>github</system>
|
<system>github</system>
|
||||||
<url>https://github.com/kekingcn/kkFileView/issues</url>
|
<url>https://github.com/kekingcn/kkFileView/issues</url>
|
||||||
</issueManagement>
|
</issueManagement>
|
||||||
|
</project>
|
||||||
</project>
|
|
||||||
383
server/pom.xml
@@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>kkFileView-parent</artifactId>
|
<artifactId>kkFileView-parent</artifactId>
|
||||||
<groupId>cn.keking</groupId>
|
<groupId>cn.keking</groupId>
|
||||||
<version>4.4.0-beta</version>
|
<version>5.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>kkFileView</artifactId>
|
<artifactId>kkFileView</artifactId>
|
||||||
@@ -24,44 +24,49 @@
|
|||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
<repository>
|
|
||||||
<id>aspose-maven-repository</id>
|
<!-- Aspose 仓库,且只启用 releases -->
|
||||||
<url>https://repository.aspose.com/repo</url>
|
<repository>
|
||||||
<snapshots>
|
<id>aspose-maven-repository</id>
|
||||||
<enabled>false</enabled>
|
<url>https://repository.aspose.com/repo</url>
|
||||||
</snapshots>
|
<releases>
|
||||||
</repository>
|
<enabled>true</enabled>
|
||||||
</repositories>
|
</releases>
|
||||||
|
<snapshots>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
</snapshots>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<!-- ========== Spring Boot 框架依赖 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-freemarker</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-devtools</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 文档格式转换 ========== -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jodconverter</groupId>
|
<groupId>org.jodconverter</groupId>
|
||||||
<artifactId>jodconverter-local</artifactId>
|
<artifactId>jodconverter-local</artifactId>
|
||||||
<version>${jodconverter.version}</version>
|
<version>${jodconverter.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- web start -->
|
<!-- ========== Office文档处理 (POI相关) ========== -->
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-jetty</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-freemarker</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<!-- web end -->
|
|
||||||
|
|
||||||
<!-- poi start -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.poi</groupId>
|
<groupId>org.apache.poi</groupId>
|
||||||
<artifactId>poi</artifactId>
|
<artifactId>poi</artifactId>
|
||||||
@@ -98,14 +103,31 @@
|
|||||||
<artifactId>fr.opensagres.xdocreport.document</artifactId>
|
<artifactId>fr.opensagres.xdocreport.document</artifactId>
|
||||||
<version>${xdocreport.version}</version>
|
<version>${xdocreport.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- poi start -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.httpcomponents</groupId>
|
<groupId>com.aspose</groupId>
|
||||||
<artifactId>httpclient</artifactId>
|
<artifactId>aspose-cad</artifactId>
|
||||||
<version>${httpcomponents.version}</version>
|
<version>${aspose-cad.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 对 rar5 的支持 和其他众多压缩支持 可参考 package net.sf.sevenzipjbinding.ArchiveFormat; -->
|
<!-- ========== PDF处理 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.pdfbox</groupId>
|
||||||
|
<artifactId>pdfbox</artifactId>
|
||||||
|
<version>${pdfbox.version}</version>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.pdfbox</groupId>
|
||||||
|
<artifactId>pdfbox-tools</artifactId>
|
||||||
|
<version>${pdfbox.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 压缩文件处理 ========== -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.sf.sevenzipjbinding</groupId>
|
<groupId>net.sf.sevenzipjbinding</groupId>
|
||||||
<artifactId>sevenzipjbinding</artifactId>
|
<artifactId>sevenzipjbinding</artifactId>
|
||||||
@@ -116,78 +138,13 @@
|
|||||||
<artifactId>sevenzipjbinding-all-platforms</artifactId>
|
<artifactId>sevenzipjbinding-all-platforms</artifactId>
|
||||||
<version>${sevenzipjbinding.version}</version>
|
<version>${sevenzipjbinding.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
<artifactId>commons-lang3</artifactId>
|
|
||||||
<version>${commons-lang3.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.redisson</groupId>
|
|
||||||
<artifactId>redisson</artifactId>
|
|
||||||
<version>${redisson.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 编码检测-JUniversalCharDet-->
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.googlecode.juniversalchardet</groupId>
|
|
||||||
<artifactId>juniversalchardet</artifactId>
|
|
||||||
<version>${juniversalchardet.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 解压(rar)-->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.junrar</groupId>
|
<groupId>com.github.junrar</groupId>
|
||||||
<artifactId>junrar</artifactId>
|
<artifactId>junrar</artifactId>
|
||||||
<version>${junrar.version}</version>
|
<version>${junrar.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>net.sourceforge.jchardet</groupId>
|
|
||||||
<artifactId>jchardet</artifactId>
|
|
||||||
<version>${jchardet.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>antlr</groupId>
|
|
||||||
<artifactId>antlr</artifactId>
|
|
||||||
<version>${antlr.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-cli</groupId>
|
|
||||||
<artifactId>commons-cli</artifactId>
|
|
||||||
<version>${commons-cli.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- FTP -->
|
<!-- ========== 图像处理 ========== -->
|
||||||
<dependency>
|
|
||||||
<groupId>commons-net</groupId>
|
|
||||||
<artifactId>commons-net</artifactId>
|
|
||||||
<version>${commons-net.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.thoughtworks.xstream</groupId>
|
|
||||||
<artifactId>xstream</artifactId>
|
|
||||||
<version>${xstream.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
|
|
||||||
<artifactId>concurrentlinkedhashmap-lru</artifactId>
|
|
||||||
<version>${concurrentlinkedhashmap.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.rocksdb</groupId>
|
|
||||||
<artifactId>rocksdbjni</artifactId>
|
|
||||||
<version>${rocksdb.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.pdfbox</groupId>
|
|
||||||
<artifactId>pdfbox</artifactId>
|
|
||||||
<version>${pdfbox.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.pdfbox</groupId>
|
|
||||||
<artifactId>pdfbox-tools</artifactId>
|
|
||||||
<version>${pdfbox.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.github.jai-imageio</groupId>
|
<groupId>com.github.jai-imageio</groupId>
|
||||||
<artifactId>jai-imageio-jpeg2000</artifactId>
|
<artifactId>jai-imageio-jpeg2000</artifactId>
|
||||||
@@ -203,79 +160,12 @@
|
|||||||
<artifactId>jbig2-imageio</artifactId>
|
<artifactId>jbig2-imageio</artifactId>
|
||||||
<version>${jbig2-imageio.version}</version>
|
<version>${jbig2-imageio.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.aspose</groupId>
|
|
||||||
<artifactId>aspose-cad</artifactId>
|
|
||||||
<version>${aspose-cad.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<!-- 密钥算法 -->
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bouncycastle</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>bcprov-jdk15on</artifactId>
|
<artifactId>commons-imaging</artifactId>
|
||||||
<version>${bcprov-jdk15on.version}</version>
|
<version>${commons-imaging.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<!-- url 规范化 -->
|
<!-- JAI 系统依赖 -->
|
||||||
<dependency>
|
|
||||||
<groupId>io.mola.galimatias</groupId>
|
|
||||||
<artifactId>galimatias</artifactId>
|
|
||||||
<version>${galimatias.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 以下是bytedeco 基于opencv ffmpeg封装的javacv,用于视频处理 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>javacv</artifactId>
|
|
||||||
<version>${bytedeco.version}</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>javacpp</artifactId>
|
|
||||||
<version>${bytedeco.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- 此版本中主要兼容linux和windows系统,如需兼容其他系统平台,请引入对应依赖即可 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>opencv</artifactId>
|
|
||||||
<version>${opencv.version}</version>
|
|
||||||
<classifier>linux-x86_64</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>opencv</artifactId>
|
|
||||||
<version>${opencv.version}</version>
|
|
||||||
<classifier>windows-x86_64</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>openblas</artifactId>
|
|
||||||
<version>${openblas.version}</version>
|
|
||||||
<classifier>linux-x86_64</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>openblas</artifactId>
|
|
||||||
<version>${openblas.version}</version>
|
|
||||||
<classifier>windows-x86_64</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>ffmpeg</artifactId>
|
|
||||||
<version>${ffmpeg.version}</version>
|
|
||||||
<classifier>linux-x86_64</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.bytedeco</groupId>
|
|
||||||
<artifactId>ffmpeg</artifactId>
|
|
||||||
<version>${ffmpeg.version}</version>
|
|
||||||
<classifier>windows-x86_64</classifier>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>com.itextpdf</groupId>
|
|
||||||
<artifactId>itextpdf</artifactId>
|
|
||||||
<version>${itextpdf.version}</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.media</groupId>
|
<groupId>javax.media</groupId>
|
||||||
<artifactId>jai_core</artifactId>
|
<artifactId>jai_core</artifactId>
|
||||||
@@ -291,25 +181,134 @@
|
|||||||
<systemPath>${pom.basedir}/lib/jai_codec-1.1.3.jar</systemPath>
|
<systemPath>${pom.basedir}/lib/jai_codec-1.1.3.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- test dependency - start -->
|
<!-- ========== 视频处理 (JavaCV) ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>javacv</artifactId>
|
||||||
|
<version>${bytedeco.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>javacpp</artifactId>
|
||||||
|
<version>${bytedeco.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>opencv</artifactId>
|
||||||
|
<version>${opencv.version}</version>
|
||||||
|
<classifier>linux-x86_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>opencv</artifactId>
|
||||||
|
<version>${opencv.version}</version>
|
||||||
|
<classifier>windows-x86_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>openblas</artifactId>
|
||||||
|
<version>${openblas.version}</version>
|
||||||
|
<classifier>linux-x86_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>openblas</artifactId>
|
||||||
|
<version>${openblas.version}</version>
|
||||||
|
<classifier>windows-x86_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>ffmpeg</artifactId>
|
||||||
|
<version>${ffmpeg.version}</version>
|
||||||
|
<classifier>linux-x86_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bytedeco</groupId>
|
||||||
|
<artifactId>ffmpeg</artifactId>
|
||||||
|
<version>${ffmpeg.version}</version>
|
||||||
|
<classifier>windows-x86_64</classifier>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 网络通信 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents.client5</groupId>
|
||||||
|
<artifactId>httpclient5</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-net</groupId>
|
||||||
|
<artifactId>commons-net</artifactId>
|
||||||
|
<version>${commons-net.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 缓存和存储 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.redisson</groupId>
|
||||||
|
<artifactId>redisson</artifactId>
|
||||||
|
<version>${redisson.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.rocksdb</groupId>
|
||||||
|
<artifactId>rocksdbjni</artifactId>
|
||||||
|
<version>${rocksdb.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.googlecode.concurrentlinkedhashmap</groupId>
|
||||||
|
<artifactId>concurrentlinkedhashmap-lru</artifactId>
|
||||||
|
<version>${concurrentlinkedhashmap.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 编码检测和字符处理 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.googlecode.juniversalchardet</groupId>
|
||||||
|
<artifactId>juniversalchardet</artifactId>
|
||||||
|
<version>${juniversalchardet.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.sourceforge.jchardet</groupId>
|
||||||
|
<artifactId>jchardet</artifactId>
|
||||||
|
<version>${jchardet.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== Apache Commons 工具库 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.commons</groupId>
|
||||||
|
<artifactId>commons-lang3</artifactId>
|
||||||
|
<version>${commons-lang3.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-cli</groupId>
|
||||||
|
<artifactId>commons-cli</artifactId>
|
||||||
|
<version>${commons-cli.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 其他工具库 ========== -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>antlr</groupId>
|
||||||
|
<artifactId>antlr</artifactId>
|
||||||
|
<version>${antlr.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.thoughtworks.xstream</groupId>
|
||||||
|
<artifactId>xstream</artifactId>
|
||||||
|
<version>${xstream.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.bouncycastle</groupId>
|
||||||
|
<artifactId>bcprov-jdk15on</artifactId>
|
||||||
|
<version>${bcprov-jdk15on.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.mola.galimatias</groupId>
|
||||||
|
<artifactId>galimatias</artifactId>
|
||||||
|
<version>${galimatias.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- ========== 测试依赖 ========== -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>commons-httpclient</groupId>
|
|
||||||
<artifactId>commons-httpclient</artifactId>
|
|
||||||
<version>${httpclient.version}</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
<exclusions>
|
|
||||||
<exclusion>
|
|
||||||
<artifactId>commons-logging</artifactId>
|
|
||||||
<groupId>commons-logging</groupId>
|
|
||||||
</exclusion>
|
|
||||||
</exclusions>
|
|
||||||
</dependency>
|
|
||||||
<!-- test dependency - end -->
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@@ -327,6 +326,14 @@
|
|||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.11.0</version>
|
||||||
|
<configuration>
|
||||||
|
<parameters>true</parameters>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
@@ -365,4 +372,4 @@
|
|||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
16
server/src/main/bin/dev.sh
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
ROOT_DIR=$(cd "$(dirname "$0")/../../../.." || exit 1; pwd)
|
||||||
|
SERVER_DIR="$ROOT_DIR/server"
|
||||||
|
|
||||||
|
if [ -n "$JAVA_HOME" ]; then
|
||||||
|
export PATH="$JAVA_HOME/bin:$PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$SERVER_DIR" || exit 1
|
||||||
|
|
||||||
|
mvn spring-boot:run \
|
||||||
|
-Dspring-boot.run.addResources=true \
|
||||||
|
-Dspring-boot.run.jvmArguments="-Dfile.encoding=UTF-8 -Dspring.config.location=$SERVER_DIR/src/main/config/application.properties"
|
||||||
@@ -8,7 +8,7 @@ install_redhat() {
|
|||||||
yum install -y libSM.x86_64 libXrender.x86_64 libXext.x86_64
|
yum install -y libSM.x86_64 libXrender.x86_64 libXext.x86_64
|
||||||
yum groupinstall -y "X Window System"
|
yum groupinstall -y "X Window System"
|
||||||
yum localinstall -y *.rpm
|
yum localinstall -y *.rpm
|
||||||
echo 'install finshed...'
|
echo 'install finished...'
|
||||||
else
|
else
|
||||||
echo 'download package error...'
|
echo 'download package error...'
|
||||||
fi
|
fi
|
||||||
@@ -20,7 +20,7 @@ install_ubuntu() {
|
|||||||
if [ $? -eq 0 ];then
|
if [ $? -eq 0 ];then
|
||||||
apt-get install -y libxinerama1 libcairo2 libcups2 libx11-xcb1
|
apt-get install -y libxinerama1 libcairo2 libcups2 libx11-xcb1
|
||||||
dpkg -i *.deb
|
dpkg -i *.deb
|
||||||
echo 'install finshed...'
|
echo 'install finished...'
|
||||||
else
|
else
|
||||||
echo 'download package error...'
|
echo 'download package error...'
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,4 +7,4 @@ echo Please check log file in ../log/kkFileView.log for more information
|
|||||||
echo You can get help in our official home site: https://kkview.cn
|
echo You can get help in our official home site: https://kkview.cn
|
||||||
echo If you need further help, please join our kk opensource community: https://t.zsxq.com/09ZHSXbsQ
|
echo If you need further help, please join our kk opensource community: https://t.zsxq.com/09ZHSXbsQ
|
||||||
echo If this project is helpful to you, please star it on https://gitee.com/kekingcn/file-online-preview/stargazers
|
echo If this project is helpful to you, please star it on https://gitee.com/kekingcn/file-online-preview/stargazers
|
||||||
java -Dspring.config.location=..\config\application.properties -jar kkFileView-4.4.0-beta.jar -> ..\log\kkFileView.log
|
java -Dspring.config.location=..\config\application.properties -jar kkFileView-4.4.0.jar -> ..\log\kkFileView.log
|
||||||
|
|||||||