박정하 박정하 03-28
250328 박정하 첨부파일 유효성 검사 추가
@acf7994ac634cb3025c602c1149341be9ff7c9a5
client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
--- client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
+++ client/views/pages/bbsDcry/photo/PicHistoryInsert.vue
@@ -274,7 +274,8 @@
         alert("제목을 입력해 주세요.");
         return;
       }
-      if (this.$isEmpty(this.pageId) && this.multipartFiles.length == 0) {
+
+      if ((this.multipartFiles.length + this.requestDTO.files.length) == 0) {
         alert("파일을 1개 이상 첨부해 주세요.");
         return;
       }
client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
--- client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
+++ client/views/pages/bbsDcry/video/VideoHistoryInsert.vue
@@ -16,23 +16,23 @@
       <dl>
         <dd>
           <label for="sj" class="require">제목</label>
-          <div class="wfull"><input type="text" id="sj" placeholder="제목을 입력하세요." v-model="reqDTO.sj"></div>
+          <div class="wfull"><input type="text" id="sj" placeholder="제목을 입력하세요." v-model="requestDTO.sj"></div>
         </dd>
         <div class="hr"></div>
         <dd>
           <label for="prdctnYear">생산연도</label>
-          <input type="text" id="prdctnYear" placeholder="생산연도를 입력하세요" v-model="reqDTO.prdctnYear">
+          <input type="text" id="prdctnYear" placeholder="생산연도를 입력하세요" v-model="requestDTO.prdctnYear">
         </dd>
         <div class="hr"></div>
         <dd>
           <label for="adres">주소</label>
-          <div class="wfull"><input type="text" id="adres" placeholder="주소를 입력하세요" v-model="reqDTO.adres"></div>
+          <div class="wfull"><input type="text" id="adres" placeholder="주소를 입력하세요" v-model="requestDTO.adres"></div>
         </dd>
         <div class="hr"></div>
         <dd>
           <label for="text">내용</label>
           <div class="wfull">
-            <EditorComponent v-model:contents="reqDTO.cn" />
+            <EditorComponent v-model:contents="requestDTO.cn" />
           </div>
         </dd>
         <div class="hr"></div>
@@ -63,7 +63,7 @@
               </label>
               <p class="mb-10">파일목록</p>
               <div id="fileNames" class="file-names">
-                <div v-if="reqDTO.files.length === 0 && multipartFiles.length === 0">선택된 파일이 없습니다.</div>
+                <div v-if="requestDTO.files.length === 0 && multipartFiles.length === 0">선택된 파일이 없습니다.</div>
                 <!-- 새로 추가된 파일 목록 -->
                 <div v-for="(file, idx) of multipartFiles" :key="idx" class="flex-sp-bw mb-5 file-wrap">
                   <div class="file-name">
@@ -73,7 +73,7 @@
                   <button type="button" class="cancel" @click="fnDelFile('new', idx)"><b>✕</b></button>
                 </div>
                 <!-- 기존 등록된 파일 목록 -->
-                <div v-for="(file, idx) of reqDTO.files" :key="idx" class="flex-sp-bw mb-5 file-wrap">
+                <div v-for="(file, idx) of requestDTO.files" :key="idx" class="flex-sp-bw mb-5 file-wrap">
                   <div class="file-name">
                     <img src="/client/resources/images/icon/imgicon.png" alt="fileicon">
                     <p>{{ file.fileNm }}</p>
@@ -131,7 +131,7 @@
       fileNames: [],
 
       // 등록/수정 요청 객체
-      reqDTO: {
+      requestDTO: {
         dcryId: null,
         sj: null,
         cn: null,
@@ -178,20 +178,20 @@
       }
     },
 
-    // dcry > reqDTO
+    // dcry > requestDTO
     copyToDcryReqDTO(dcry) {
-      const copyFields = Object.keys(this.reqDTO).filter(key => key !== 'dcryId' && key !== 'ty' && key !== 'files');
+      const copyFields = Object.keys(this.requestDTO).filter(key => key !== 'dcryId' && key !== 'ty' && key !== 'files');
       copyFields.forEach(field => {
-        this.reqDTO[field] = this.$isEmpty(dcry[field]) ? null : dcry[field];
+        this.requestDTO[field] = this.$isEmpty(dcry[field]) ? null : dcry[field];
       });
 
-      this.reqDTO.ty = 'V'; // 영상기록물
-      this.reqDTO.files = dcry.files.length > 0 ? dcry.files : []; // 기존 첨부파일
+      this.requestDTO.ty = 'V'; // 영상기록물
+      this.requestDTO.files = dcry.files.length > 0 ? dcry.files : []; // 기존 첨부파일
 
       this.multipartFiles = [];
       this.selectedCtgries = dcry.ctgrys.length > 0 ? dcry.ctgrys : [];
 
-      console.log(this.reqDTO);
+      console.log(this.requestDTO);
     },
 
     // 카테고리 모달 열기/닫기
@@ -239,7 +239,7 @@
       const maxSize = 10 * 1024 * 1024 * 1024; // 10GB
 
       // 유효성 검사
-      if (files.length > 1 + this.multipartFiles.length + this.reqDTO.files.length > 0) {
+      if ((files.length + this.multipartFiles.length + this.requestDTO.files.length) > 1) {
         alert("영상 파일은 한 개만 등록 가능합니다.");
         return;
       }
@@ -249,7 +249,7 @@
 
         // 파일 타입 검증
         if (!allowedTypes.includes(fileType)) {
-          alert(`${file.name} 파일은 허용되지 않는 형식입니다. 이미지 파일(jpg, jpeg, png, gif)만 업로드 가능합니다.`);
+          alert(`${file.name} 파일은 허용되지 않는 형식입니다. 영상 파일(mp4, mov, avi, wmv, mkv, webm)만 업로드 가능합니다.`);
           return;
         }
 
@@ -268,18 +268,19 @@
       if (type === 'new') {
         this.multipartFiles.splice(separator, 1);
       } else if (type === 'old') {
-        this.reqDTO.files = this.reqDTO.files.filter(item => item.fileId !== separator);
+        this.requestDTO.files = this.requestDTO.files.filter(item => item.fileId !== separator);
       }
     },
 
     // 등록
     async submitForm() {
       // 유효성 검사
-      if (!this.reqDTO.sj) {
+      if (!this.requestDTO.sj) {
         alert("제목을 입력해 주세요.");
         return;
       }
-      if (this.$isEmpty(this.pageId) && this.multipartFiles.length == 0) {
+
+      if ((this.multipartFiles.length + this.requestDTO.files.length) == 0) {
         alert("파일을 1개 이상 첨부해 주세요.");
         return;
       }
@@ -288,11 +289,11 @@
         const formData = new FormData();
 
         // 텍스트 데이터 추가
-        formData.append('sj', this.reqDTO.sj);
-        formData.append('cn', this.reqDTO.cn);
-        formData.append('adres', this.reqDTO.adres);
-        formData.append('prdctnYear', this.reqDTO.prdctnYear);
-        formData.append('ty', this.reqDTO.ty);
+        formData.append('sj', this.requestDTO.sj);
+        formData.append('cn', this.requestDTO.cn);
+        formData.append('adres', this.requestDTO.adres);
+        formData.append('prdctnYear', this.requestDTO.prdctnYear);
+        formData.append('ty', this.requestDTO.ty);
 
         // 게시물 아이디
         if (!this.$isEmpty(this.pageId)) {
@@ -300,8 +301,8 @@
         }
 
         // 파일 아이디
-        if (!this.$isEmpty(this.reqDTO.fileId)) {
-          formData.append('fileId', this.reqDTO.fileId);
+        if (!this.$isEmpty(this.requestDTO.fileId)) {
+          formData.append('fileId', this.requestDTO.fileId);
         }
 
         // 카테고리 Ids 추가
@@ -317,8 +318,8 @@
         }
 
         // 기존파일 수정
-        if (!this.$isEmpty(this.pageId) && this.reqDTO.files.length > 0) {
-          for (let file of this.reqDTO.files) {
+        if (!this.$isEmpty(this.pageId) && this.requestDTO.files.length > 0) {
+          for (let file of this.requestDTO.files) {
             formData.append("files", file.fileId);
           }
         }
client/views/pages/bbsNesDta/NewsReleaseInsert.vue
--- client/views/pages/bbsNesDta/NewsReleaseInsert.vue
+++ client/views/pages/bbsNesDta/NewsReleaseInsert.vue
@@ -231,6 +231,12 @@
       const allowedTypes = ['jpg', 'jpeg', 'png', 'gif']; // 이미지 파일만 허용
       const maxSize = 10 * 1024 * 1024 * 1024; // 10GB
 
+      // 유효성 검사
+      if ((files.length + this.multipartFiles.length + this.requestDTO.files.length) > 1) {
+        alert("썸네일은 한 개만 등록 가능합니다.");
+        return;
+      }
+
       for (let file of files) {
         const fileType = file.name.split('.').pop().toLowerCase();
 
Add a comment
List