summaryrefslogtreecommitdiff
path: root/lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx
diff options
context:
space:
mode:
authorTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2025-11-10 11:25:19 +0900
committerTheSiahxyz <164138827+TheSiahxyz@users.noreply.github.com>2025-11-10 11:25:19 +0900
commita5501ad1d1cb836d2b2f84e9b0f06049e22c901e (patch)
tree667ed8c5d6ec35b109190e9f976d66ae54def4ce /lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx
parentb0fe980376fcf1a19ff4b90851ca8b01f378fdc0 (diff)
parentf8a38907911d940cb2e8e6c9aa49488d05b2b578 (diff)
Merge remote-tracking branch 'origin/dujinkim' into master_homemaster
Diffstat (limited to 'lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx')
-rw-r--r--lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx51
1 files changed, 49 insertions, 2 deletions
diff --git a/lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx b/lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx
index 3ff2f467..be656a48 100644
--- a/lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx
+++ b/lib/vendor-document-list/ship/bulk-b4-upload-dialog.tsx
@@ -163,9 +163,53 @@ export function BulkB4UploadDialog({
setPendingProjectId("")
}
+ // 파일 검증 함수
+ const validateFile = (file: File): { valid: boolean; error?: string } => {
+ const MAX_FILE_SIZE = 1024 * 1024 * 1024 // 1GB
+ const FORBIDDEN_EXTENSIONS = ['exe', 'com', 'dll', 'vbs', 'js', 'asp', 'aspx', 'bat', 'cmd']
+
+ // 파일 크기 검증
+ if (file.size > MAX_FILE_SIZE) {
+ return {
+ valid: false,
+ error: `파일 크기가 1GB를 초과합니다 (${(file.size / (1024 * 1024 * 1024)).toFixed(2)}GB)`
+ }
+ }
+
+ // 파일 확장자 검증
+ const extension = file.name.split('.').pop()?.toLowerCase()
+ if (extension && FORBIDDEN_EXTENSIONS.includes(extension)) {
+ return {
+ valid: false,
+ error: `금지된 파일 형식입니다 (.${extension})`
+ }
+ }
+
+ return { valid: true }
+ }
+
// 파일 선택 시 파싱
const handleFilesChange = (files: File[]) => {
- const parsed = files.map(file => {
+ const validFiles: File[] = []
+ const invalidFiles: string[] = []
+
+ // 파일 검증
+ files.forEach(file => {
+ const validation = validateFile(file)
+ if (validation.valid) {
+ validFiles.push(file)
+ } else {
+ invalidFiles.push(`${file.name}: ${validation.error}`)
+ }
+ })
+
+ // 유효하지 않은 파일이 있으면 토스트 표시
+ if (invalidFiles.length > 0) {
+ invalidFiles.forEach(msg => toast.error(msg))
+ }
+
+ // 유효한 파일만 파싱
+ const parsed = validFiles.map(file => {
const { docNumber, revision } = parseFileName(file.name)
return {
file,
@@ -429,7 +473,10 @@ export function BulkB4UploadDialog({
}
</p>
<p className="text-xs text-muted-foreground mt-1">
- PDF, DOC, DOCX, XLS, XLSX, DWG, DXF
+ PDF, DOC, DOCX, XLS, XLSX, DWG, DXF (max 1GB per file)
+ </p>
+ <p className="text-xs text-red-600 mt-1 font-medium">
+ Forbidden: .exe, .com, .dll, .vbs, .js, .asp, .aspx, .bat, .cmd
</p>
</label>
</div>