release: v1.2.3 — 修复简短图片链接在按年/月存储下 404
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
ci / ci (22, ubuntu-latest) (push) Canceled after 0s
Publish Docker image / build (linux/amd64, ubuntu-latest, amd64) (push) Canceled after 0s
Publish Docker image / build (linux/arm64, ubuntu-24.04-arm, arm64) (push) Canceled after 0s
Publish Docker image / merge (push) Canceled after 0s
GitHub Release / release (push) Canceled after 0s
开启简短链接时纯文件名直链先经 SQLite 索引反查完整 key,不再误解析为扁平 images/文件名路径。
This commit is contained in:
1 parent
c9c34515dd
commit
20afda5869
7 files changed
+57
-7
No files matched your search
@@ -4,6 +4,12 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [1.2.3] - 2026-08-30
|
||||
|
||||
### 修复
|
||||
|
||||
- 开启「简短图片链接」且按年/月分组时,纯文件名直链(如 `/xxx.webp`)误解析为 `images/xxx.webp` 导致 404;现先经 SQLite 索引反查完整 key
|
||||
|
||||
## [1.2.2] - 2026-08-30
|
||||
|
||||
### 修复
|
||||
|
||||
@@ -4,6 +4,14 @@ Version history and notable changes. The full log is also in the repo root [CHAN
|
||||
|
||||
---
|
||||
|
||||
## [1.2.3] — 2026-08-30
|
||||
|
||||
### Fix
|
||||
|
||||
- **Short links + date-based storage**: bare filename URLs (e.g. `https://host/xxx.webp`) no longer map to flat `images/xxx.webp`; SQLite index resolves the full `images/YYYY/MM/xxx.webp` key so thumbnails and short links work again
|
||||
|
||||
---
|
||||
|
||||
## [1.2.2] — 2026-08-30
|
||||
|
||||
> **Restart the service** after upgrading so middleware and API updates take effect.
|
||||
|
||||
@@ -4,6 +4,14 @@ PicHost 版本历史与重要变更说明。完整记录亦见仓库根目录 [C
|
||||
|
||||
---
|
||||
|
||||
## [1.2.3] — 2026-08-30
|
||||
|
||||
### 修复
|
||||
|
||||
- **简短图片链接 + 按年/月分组**:纯文件名直链(如 `https://域名/xxx.webp`)不再误当成 `images/xxx.webp`,改为经 SQLite 索引反查 `images/年/月/xxx.webp`,缩略图与短链恢复正常
|
||||
|
||||
---
|
||||
|
||||
## [1.2.2] — 2026-08-30
|
||||
|
||||
> 升级后请**重启服务**使中间件与 API 生效。
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "pichost",
|
||||
"version": "1.2.2",
|
||||
"version": "1.2.3",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "pichost",
|
||||
"version": "1.2.2",
|
||||
"version": "1.2.3",
|
||||
"hasInstallScript": true,
|
||||
"license": "GPL-3.0-only",
|
||||
"dependencies": {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pichost",
|
||||
"version": "1.2.2",
|
||||
"version": "1.2.3",
|
||||
"description": "Self-hosted image hosting for your NAS / home server — Nuxt admin UI, local disk or S3-compatible storage, server-side WebP compression, referer protection, Twikoo/EasyImage compatible.",
|
||||
"homepage": "https://github.com/O96u/PicHost#readme",
|
||||
"repository": {
|
||||
|
||||
@@ -1,10 +1,31 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import { describe, expect, it, vi, afterEach } from 'vitest'
|
||||
import { findImageKeyByDatePath, findImageKeyByFilename } from './image-index'
|
||||
import { requestPathToImageKey } from './serve-image'
|
||||
|
||||
vi.mock('./image-index', async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import('./image-index')>()
|
||||
return {
|
||||
...actual,
|
||||
findImageKeyByFilename: vi.fn(actual.findImageKeyByFilename),
|
||||
findImageKeyByDatePath: vi.fn(actual.findImageKeyByDatePath)
|
||||
}
|
||||
})
|
||||
|
||||
describe('requestPathToImageKey hide folder', () => {
|
||||
it('resolves bare filename to default folder flat key', () => {
|
||||
afterEach(() => {
|
||||
vi.mocked(findImageKeyByFilename).mockReset()
|
||||
vi.mocked(findImageKeyByDatePath).mockReset()
|
||||
})
|
||||
|
||||
it('resolves bare filename via index when hide folder is enabled', () => {
|
||||
vi.mocked(findImageKeyByFilename).mockReturnValue('images/2026/08/demo.webp')
|
||||
expect(requestPathToImageKey('/demo.webp', { hideFolder: true }))
|
||||
.toBe('images/demo.webp')
|
||||
.toBe('images/2026/08/demo.webp')
|
||||
})
|
||||
|
||||
it('does not guess flat images/name when hide folder is enabled', () => {
|
||||
vi.mocked(findImageKeyByFilename).mockReturnValue(null)
|
||||
expect(requestPathToImageKey('/demo.webp', { hideFolder: true })).toBeNull()
|
||||
})
|
||||
|
||||
it('resolves hidden date path to default folder key', () => {
|
||||
|
||||
@@ -8,7 +8,7 @@ import {
|
||||
} from './env'
|
||||
import { findImageKeyByDatePath, findImageKeyByFilename } from './image-index'
|
||||
import { validateImageKey } from './image-key'
|
||||
import { toStorageKeyFromPublicPath } from './image-public-path'
|
||||
import { isBareImageFilename, toStorageKeyFromPublicPath } from './image-public-path'
|
||||
import { buildPublicImageUrl } from './image-response'
|
||||
import { createImageStream, headImage } from './storage'
|
||||
import { getBackendRowForKey } from './storage/resolver'
|
||||
@@ -85,6 +85,13 @@ export function requestPathToImageKey(
|
||||
|
||||
if (validateImageKey(raw)) return raw
|
||||
|
||||
// 简短链接:纯文件名须先走索引反查,不能猜成 images/文件名(与按年/月存储冲突)
|
||||
if (options?.hideFolder && isBareImageFilename(raw)) {
|
||||
const byFilename = findImageKeyByFilename(raw)
|
||||
if (byFilename && validateImageKey(byFilename)) return byFilename
|
||||
return null
|
||||
}
|
||||
|
||||
const fromPublic = toStorageKeyFromPublicPath(raw)
|
||||
if (fromPublic) return fromPublic
|
||||
|
||||
|
||||
Reference in new issue
Block a user