fix(upload): MiB/MB 단위 혼용 해소 + 용량 초과 스킵 토스트 반영

Caddy `request_body max_size 100MB`가 go-humanize SI(100,000,000 바이트)로
파싱되는데 클라이언트 pre-check는 `100 * 1024 * 1024`(104,857,600 바이트, MiB)로
비교해 100,000,001–104,857,600 바이트 구간 파일이 사전 차단을 통과한 뒤
서버에서 413을 받던 문제를 수정. 표시 라벨도 `/1024/1024`로 나누고 'MB'라
적어 경계값 파일이 "100MB 초과 … (100.0MB)" 같은 모순 문구를 노출했음.

요약 토스트가 사전 차단된 파일(`tooLarge`)을 카운트에서 제외해 드롭 수량과
불일치하던 문제도 함께 정리. `N건 용량 초과 스킵`을 tail로 붙이고, 전부
스킵된 경우엔 추가 토스트 없이 기존 에러 토스트만 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-04-17 07:25:36 +09:00
parent 8a8096a444
commit afd592c85c
@@ -6,9 +6,9 @@
let { onupload = () => {} } = $props();
// home-caddy `request_body max_size 100MB` (infra_inventory.md D8 / Cloudflare 섹션 참조).
// home-caddy `request_body max_size 100MB` (go-humanize SI 기준 100,000,000 바이트).
// 100MB 초과 파일은 NAS PKM 폴더 직접 마운트 → file_watcher 5분 간격 자동 인덱싱 경로 사용.
const MAX_UPLOAD_BYTES = 100 * 1024 * 1024;
const MAX_UPLOAD_BYTES = 100 * 1000 * 1000;
const NAS_FALLBACK_HINT = '대용량 파일은 NAS의 PKM 폴더에 직접 두면 file_watcher 가 5분 이내에 자동 인덱싱합니다.';
let dragging = $state(false);
@@ -70,7 +70,7 @@
if (tooLarge.length > 0) {
const names = tooLarge
.map(f => `${f.name} (${(f.size / 1024 / 1024).toFixed(1)}MB)`)
.map(f => `${f.name} (${(f.size / 1000 / 1000).toFixed(1)}MB)`)
.join(', ');
addToast(
'error',
@@ -112,11 +112,16 @@
uploadFiles = [...uploadFiles];
}
const skipped = tooLarge.length;
const tail =
(failed > 0 ? `, ${failed}건 실패` : '') +
(skipped > 0 ? `, ${skipped}건 용량 초과 스킵` : '');
if (success > 0) {
addToast('success', `${success}건 업로드 완료${failed > 0 ? `, ${failed}건 실패` : ''}`);
addToast('success', `${success}건 업로드 완료${tail}`);
onupload();
} else {
addToast('error', `업로드 실패 (${failed}건)`);
} else if (failed > 0) {
addToast('error', `업로드 실패 (${failed}건)${skipped > 0 ? `, ${skipped}건 용량 초과 스킵` : ''}`);
}
setTimeout(() => {