관리자 업로드 제한 설정 추가

This commit is contained in:
2026-07-01 17:58:30 +09:00
parent 129b68b939
commit e5d3eac2fd
17 changed files with 308 additions and 20 deletions

View File

@@ -26,6 +26,15 @@ const VIDEO_EXTENSIONS = new Set(['.mp4', '.webm', '.mov'])
const AUDIO_EXTENSIONS = new Set(['.mp3', '.wav', '.ogg', '.m4a'])
const IMAGE_EXTENSIONS = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif'])
export const DEFAULT_UPLOAD_MAX_FILE_COUNT = 20
export const DEFAULT_UPLOAD_MAX_TOTAL_SIZE = 314572800
export const MIN_UPLOAD_MAX_FILE_COUNT = 1
export const MAX_UPLOAD_MAX_FILE_COUNT = 50
export const MIN_UPLOAD_MAX_TOTAL_SIZE = 1048576
export const MAX_UPLOAD_MAX_TOTAL_SIZE = 1073741824
export const UPLOAD_FILE_COUNT_OPTIONS = [5, 10, 20, 30, 50]
export const UPLOAD_TOTAL_SIZE_OPTIONS = [52428800, 104857600, 209715200, 314572800, 524288000, 1073741824]
/** @type {Record<string, string>} 업로드 종류 한글 라벨 */
const UPLOAD_KIND_LABELS = {
[UPLOAD_KIND.image]: '이미지',
@@ -47,6 +56,69 @@ export const buildDefaultUploadSizeLimits = (overrides = {}) => ({
...overrides
})
/**
* 업로드 최대 파일 수를 정규화한다.
* @param {unknown} value - 원본 값
* @returns {number} 최대 파일 수
*/
export const normalizeUploadMaxFileCount = (value) => {
const parsed = Number(value)
if (!Number.isFinite(parsed)) {
return DEFAULT_UPLOAD_MAX_FILE_COUNT
}
const rounded = Math.round(parsed)
if (rounded < MIN_UPLOAD_MAX_FILE_COUNT) {
return MIN_UPLOAD_MAX_FILE_COUNT
}
if (rounded > MAX_UPLOAD_MAX_FILE_COUNT) {
return MAX_UPLOAD_MAX_FILE_COUNT
}
return rounded
}
/**
* 업로드 최대 총량을 정규화한다.
* @param {unknown} value - 원본 값
* @returns {number} 최대 총량 바이트
*/
export const normalizeUploadMaxTotalSize = (value) => {
const parsed = Number(value)
if (!Number.isFinite(parsed)) {
return DEFAULT_UPLOAD_MAX_TOTAL_SIZE
}
const rounded = Math.round(parsed)
if (rounded < MIN_UPLOAD_MAX_TOTAL_SIZE) {
return MIN_UPLOAD_MAX_TOTAL_SIZE
}
if (rounded > MAX_UPLOAD_MAX_TOTAL_SIZE) {
return MAX_UPLOAD_MAX_TOTAL_SIZE
}
return rounded
}
/**
* 업로드 파일 크기를 반환한다.
* @param {Object} file - 브라우저 File 또는 서버 multipart 파일 파트
* @returns {number} 파일 크기
*/
export const getUploadFileSize = (file) => {
const size = file?.size ?? file?.data?.length ?? 0
const parsed = Number(size)
return Number.isFinite(parsed) && parsed > 0 ? parsed : 0
}
/**
* 업로드 파일 전체 크기를 반환한다.
* @param {Iterable<Object>|ArrayLike<Object>} files - 업로드 파일 목록
* @returns {number} 전체 크기
*/
export const getUploadFilesTotalSize = (files) => Array.from(files || [])
.reduce((total, file) => total + getUploadFileSize(file), 0)
/**
* MIME·파일명으로 업로드 종류를 판별한다.
* @param {string} [mimeType] - MIME 타입