release: v1.4.1 — 上传策略设置、保留原图与上传 tagNames
GitHub Release / release (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
ci / ci (22, ubuntu-latest) (push) Canceled after 0s

管理员可在设置页配置上传大小、格式、限流与保留原图;上传 API 支持按标签名称打标。
This commit is contained in:
O96u committed 2026-09-16 10:03:05 +08:00
1 parent d0eb364645
commit 6cc4f27f7d
25 files changed
+1354 -172

No files matched your search

+12 -8
View File
@@ -2,10 +2,6 @@ import sharp from 'sharp'
import type { H3Event } from 'h3'
import type { ImageItem, UploadErrorItem } from '~/types/image'
import type { AllowedMimeType } from './constants'
import {
ALLOWED_MIME_TYPES,
MAX_FILE_SIZE
} from './constants'
import {
detectMimeFromSignature,
isAllowedMimeType,
@@ -15,6 +11,12 @@ import type { LogSource } from './db'
import { generateImageKey } from './image-key'
import { buildImageItem, sanitizeOriginalName } from './image-response'
import { getStorageLayout, getWebpQuality } from './env'
import {
formatMaxFileSizeMessage,
getMaxFileSizeBytes,
isMimeTypeAllowed,
isPreserveOriginalUpload
} from './upload-policy'
import { logActivity } from './activity-log'
import { attachTagsAfterUpload, getTagsForImageKeys } from './tags'
import { putImage } from './storage'
@@ -71,13 +73,13 @@ export async function processSingleImageUpload(
const originalName = sanitizeOriginalName(input.filename ?? 'image')
const bytes = input.bytes
if (bytes.byteLength > MAX_FILE_SIZE) {
if (bytes.byteLength > getMaxFileSizeBytes()) {
return {
error: {
name: originalName,
error: {
code: 'FILE_TOO_LARGE',
message: '图片大小不能超过 10 MB'
message: formatMaxFileSizeMessage()
}
}
}
@@ -96,7 +98,7 @@ export async function processSingleImageUpload(
}
}
if (!ALLOWED_MIME_TYPES.includes(detectedMime)) {
if (!isMimeTypeAllowed(detectedMime)) {
return {
error: {
name: originalName,
@@ -120,7 +122,9 @@ export async function processSingleImageUpload(
}
}
const compressed = await compressToWebp(bytes, detectedMime, getWebpQuality(event))
const compressed = isPreserveOriginalUpload()
? { bytes, mime: detectedMime }
: await compressToWebp(bytes, detectedMime, getWebpQuality(event))
const uploadedAt = new Date().toISOString()
const layout = getStorageLayout(event)