Browse Source

update 2024-06-05

junggilpark 1 year ago
parent
commit
bfa63fe19d
5 changed files with 339 additions and 106 deletions
  1. 3 0
      package-lock.json
  2. 3 0
      package.json
  3. 275 92
      src/app.js
  4. 1 1
      src/config/sql.js
  5. 57 13
      src/views/hello.html

+ 3 - 0
package-lock.json

@@ -23,7 +23,9 @@
                 "env": "^0.0.2",
                 "express": "^4.19.2",
                 "express-session": "^1.18.0",
+                "form-data": "^4.0.0",
                 "fs": "^0.0.1-security",
+                "http-errors": "^2.0.0",
                 "jszip": "^3.10.1",
                 "mssql": "^10.0.2",
                 "multer": "^1.4.5-lts.1",
@@ -32,6 +34,7 @@
                 "restify": "^11.1.0",
                 "send": "^0.18.0",
                 "unzipper": "^0.11.4",
+                "uuid": "^9.0.1",
                 "websocket": "^1.0.35",
                 "write-excel-file": "^2.0.1",
                 "wss": "^3.3.4",

+ 3 - 0
package.json

@@ -21,7 +21,9 @@
         "env": "^0.0.2",
         "express": "^4.19.2",
         "express-session": "^1.18.0",
+        "form-data": "^4.0.0",
         "fs": "^0.0.1-security",
+        "http-errors": "^2.0.0",
         "jszip": "^3.10.1",
         "mssql": "^10.0.2",
         "multer": "^1.4.5-lts.1",
@@ -30,6 +32,7 @@
         "restify": "^11.1.0",
         "send": "^0.18.0",
         "unzipper": "^0.11.4",
+        "uuid": "^9.0.1",
         "websocket": "^1.0.35",
         "write-excel-file": "^2.0.1",
         "wss": "^3.3.4",

+ 275 - 92
src/app.js

@@ -1,7 +1,7 @@
 const cookieParser = require('cookie-parser');
 const cors = require("cors");
 const fs = require("fs");
-const path = require("path");
+const globalPath = require("path");
 const express = require("express");
 const axios = require("axios");
 // const SERVER_PORT = process.env.port || process.env.PORT || 53000;
@@ -17,9 +17,19 @@ const multer  = require('multer');
 const XLSX = require('xlsx');
 const pptxgen = require('pptxgenjs');
 const msal = require('@azure/msal-node');
+const FormData = require("form-data");
 const {pool, sql} = require('./config/sql.js');
+const { v4: uuidv4 } = require('uuid');
+
+const apiUrl = 'http://192.168.20.99:5050';
+
+const createErrors = require('http-errors');
+
 const gateWayKey = process.env.GATE_WAY_KEY;
 
+const errorMap = new Map([
+
+]);
 
 const msalConfig = {
   auth: {
@@ -72,7 +82,7 @@ serverApp.use(session({
 serverApp.set(express.json());
 serverApp.use(cookieParser());
 serverApp.use(express.urlencoded({ extended: false }));
-serverApp.use("/static", express.static(path.join(__dirname, 'static')));
+serverApp.use("/static", express.static(globalPath.join(__dirname, 'static')));
 
 const options = {
   key: process.env.SSL_KEY_FILE ? fs.readFileSync(process.env.SSL_KEY_FILE) : undefined,
@@ -132,7 +142,7 @@ serverApp.use(bodyParser.json());
 serverApp.get("/tab", 
   // isAuthenticated, 
   async function (req, res, next) {
-    res.sendFile(path.join(__dirname, "/views/hello.html"), 
+    res.sendFile(globalPath.join(__dirname, "/views/hello.html"), 
       // { idTokenClaims: req.session.account.idTokenClaims }
     );
   }
@@ -250,6 +260,7 @@ serverApp.get("/post-redirect",
 // }));
 serverApp.post("/getGroupList",  async function (req, res, next) {
   try {
+    // throw new Error('Error');
       const oneDrive = await getFetch(endPoint + "/me/drive/root", req.session.accessToken);
       const sharePointIds = await getFetch(endPoint + "/me/drive/SharePointIds", req.session.accessToken);
       // const publicTeam = await getFetch(endPoint + "/groups?$filter=groupTypes/any(c:c+eq+'Unified')", req.session.accessToken);
@@ -398,10 +409,16 @@ serverApp.post('/api/makeWord',
       Packer.toBuffer(doc).then(async (buffer)=>{
         const resultObj = {message:"", success: 'F'};;
         try{
+          const base64EncodeData = Buffer.from(buffer).toString('base64');
+          const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name, 
+                      "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New Word 문서");
+          if (labelData.success === 'F') {
+            return res.json(labelData);
+          }
           const sitesInfo = await axios.get(endPoint + "/sites/"+ siteId + path, options);
           if (sitesInfo.data && sitesInfo.data.id) {
             const itemId = sitesInfo.data.id;
-            const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+name+':/content', buffer, options);
+            const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+name+':/content', labelData.data, options);
             if (result.data) {
               resultObj.message = "요청하신 Word 파일이 생성되었습니다.<br>파일명 : "+ name;
               resultObj.success = 'S';
@@ -431,11 +448,19 @@ serverApp.post('/api/makeExcel',
       const wb = XLSX.utils.book_new();
       XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet([]), 'Sheet1');
       var wbout = XLSX.write(wb, {bookType:'xlsx',  type: 'buffer'});
+      const base64EncodeData = Buffer.from(wbout).toString('base64');
+      
       const resultObj = {message:'', success: 'F'};
       try{
+        const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name, 
+                                        "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New Excel 통합 문서");
+        if (labelData.success === 'F') {
+          return res.json(labelData);
+        }
+        
         const parentData = await axios.get(endPoint + "/sites/"+ siteId +path, options);
         if (parentData.data) {
-          const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+parentData.data.id+':/'+name+':/content', wbout, options);
+          const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+parentData.data.id+':/'+name+':/content', labelData.data, options);
           if (result.data) {
             resultObj.message ='요청하신 Excel 파일이 생성 되었습니다.';
             resultObj.success = 'S';
@@ -446,10 +471,110 @@ serverApp.post('/api/makeExcel',
         }
       }
       catch(error) {
-        resultObj.message = "요청하신 Word 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
+        resultObj.message = "요청하신 Excel 파일 생성 중 오류가 발생하였습니다.<br>" + getErrorMessage(error);
       }
       res.json(resultObj);
 })
+async function setLabelFiles(param, headers, lengthSync, apiKey, email) {
+  console.log('======================setLabelFiles=====================================')
+  // const param = {
+  //   apiKey: apiKey,
+  //   email: email,
+  //   file : files,
+    // dispFileName: dispFileName,
+    // aipGuid: aipGuid,
+    // fileData: fileData,
+    // comment: comment,
+  // }
+  const resultObj = {
+    message : null,
+    success : 'F',
+    data : null,
+  }
+  const errorMessage = '레이블 적용 중 오류가 발생했습니다.<br>에러 : ';
+  try {
+
+    // const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param);
+    // console.log('실행')
+    // console.log(param);
+    const result = await axios.post(apiUrl + '/api/v1/file/encrypt', param, {
+      headers : {
+        ...headers,
+        "Content-Length" : lengthSync,
+      }
+    });
+    // console.log(result.data);
+    if (result && result.data) {
+      if (result.data.statusCode === 200 && !result.data.result.errorCode) {
+        // resultObj.data = Buffer.from(result.data.result.fileData, "base64");
+        // console.log(param.get('apiKey'));
+        // console.log(param.get('email'));
+        const infoParam = {
+          apiKey: apiKey,
+          email: email,
+          dispFileName: result.data.result.dispFileName,
+          realFileName: result.data.result.outputFileName,
+        }
+        console.log(infoParam);
+        const infoData = await axios.post(apiUrl + '/api/v1/file/info', infoParam);
+        console.log('=================infoData ========================');
+        console.log(infoData.data);
+        resultObj.data = result.data.result;
+        resultObj.success = 'S'; 
+      }
+      else {
+        resultObj.message = errorMessage + result.data.result.errorMessage;
+      }
+    }
+    else {
+      resultObj.message = errorMessage + '수신 데이터 없음';
+    }
+  }
+  catch (error) {
+    console.log(error);
+    resultObj.message = errorMessage + JSON.stringify(error);
+  }
+
+  return resultObj;
+}
+
+async function setLabel(apiKey, email, dispFileName, aipGuid, fileData, comment) {
+  const param = {
+    apiKey: apiKey,
+    email: email,
+    dispFileName: dispFileName,
+    aipGuid: aipGuid,
+    fileData: fileData,
+    comment: comment,
+  }
+  const resultObj = {
+    message : null,
+    success : 'F',
+    data : null,
+  }
+  const errorMessage = '레이블 적용 중 오류가 발생했습니다.<br>에러 : ';
+  try {
+
+    const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param);
+    if (result && result.data) {
+      if (result.data.statusCode === 200 && !result.data.result.errorCode && result.data.result.fileData) {
+        resultObj.data = Buffer.from(result.data.result.fileData, "base64");
+        resultObj.success = 'S';
+      }
+      else {
+        resultObj.message = errorMessage + result.data.result.errorMessage;
+      }
+    }
+    else {
+      resultObj.message = errorMessage + '수신 데이터 없음';
+    }
+  }
+  catch (error) {
+    resultObj.message = errorMessage + JSON.stringify(error);
+  }
+
+  return resultObj;
+}
 
 serverApp.post('/api/makePptx', 
     // isAuthenticated,
@@ -463,9 +588,16 @@ serverApp.post('/api/makePptx',
       const resultObj = {message:'', success: 'F'};
       pres.stream().then(async (data)=>{
         try{
+          const base64EncodeData = Buffer.from(data).toString('base64');
+          const labelData = await setLabel(gateWayKey, req.session.account.idTokenClaims.email, name, 
+                      "878173ae-cc36-4881-af57-604af868314c", base64EncodeData, "Make New PowerPoint 프레젠테이션");
+
+          if (labelData.success === 'F') {
+            return res.json(labelData);
+          }
           const parentData = await axios.get(endPoint + "/sites/"+ siteId +path, options);
           if (parentData.data) {
-            const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+parentData.data.id+':/'+name+':/content', data, options);
+            const result = await axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+parentData.data.id+':/'+name+':/content', labelData.data, options);
             if (result.data) {
               resultObj.message ='요청하신 PowerPoint 프레젠테이션 파일이 생성 되었습니다.';
               resultObj.success = 'S';
@@ -606,19 +738,19 @@ serverApp.post('/api/upload', upload.array('file'),
 
         const promiseArray = [];
         if (files && files.length > 0) {
-          console.log(files);
           let beforeUri = '';
           let beforeItemId = '';
-          for (let file of files) {
-            const fileName = file.originalname;
-            let filePath = req.body[ fileName + "_path"];
+          const possibleExt = await getPossibleExt();
+          for (let idx in files) {
+            const file = files[idx];
+            //const fileName = file.originalname;
+            //let filePath = req.body[ fileName + "_path"];
             file.originalname = Buffer.from(file.originalname, 'ascii').toString('utf8');
             let originName = file.originalname;
-            
-            if (originName.lastIndexOf('.') >= 0) {
-              const possibleExt = await getPossibleExt();
+            if (originName && possibleExt) {
+              const ext = globalPath.extname(originName);
+              
               const {supported_file_ext, protected_file_ext} = possibleExt.data;
-              const ext = originName.substring(originName.lastIndexOf('.'), originName.length);
               
               if (supported_file_ext && protected_file_ext) {
                 
@@ -633,68 +765,124 @@ serverApp.post('/api/upload', upload.array('file'),
                                       +'<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :' 
                                       + JSON.stringify(supportedArr)});
                 }
-
-                const fileData = Buffer.from(file.buffer).toString('base64');
+                const uuid = uuidv4();
+                const realFileName = uuid + ext;
+                fs.writeFileSync('Z:/Source/' + realFileName, file.buffer);
                 const param = {
                   apiKey: gateWayKey,
                   email: req.session.account.idTokenClaims.email,
                   dispFileName: originName,
+                  realFileName : realFileName,
                   aipGuid: "878173ae-cc36-4881-af57-604af868314c",
                   comment: "",
-                  fileData: fileData
                 }
-                console.log(param);
+
                 try {
-                  const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/set-label', param);
-                  console.log(result);
-                  if (result) {
-                    if (result.data.statusCode === 200 && !result.data.result.errorCode) {
-                      let bufferValue = Buffer.from(result.data.result.fileData, "base64");
-                      file = bufferValue;
-                    }
-                    else {
-                      console.log(result.data);
-                      return res.json({success:'F', message: '파일명 : ' + originName + '<br>에러 : ' + result.data.result.errorMessage});
-                    }
+                  const result = await axios.post(apiUrl + '/api/v1/file/set-label', param);
+                  if (result.data.statusCode !== 200 && result.data.result.errorCode) {
+                    console.log(result.data.result);
+                    return res.json({success:'F', message: '파일 레이블 작업 중 오류가 발생했습니다.<br>에러 : ' + result.data.result.errorMessage});
                   }
                 }
                 catch(error) {
-                  console.log(error);
+                  return res.json({success:'F', message: '파일 레이블 작업 중 오류가 발생했습니다.<br>에러 : ' + JSON.stringify(error.message)});
+                }
+                const labelFile = fs.readFileSync('Z:/Source/' + realFileName);
+                
+                let formatPath = '';
+                
+                if (file_path[idx]) {
+                  if (!path.includes(":")) {
+                    formatPath = ":" + file_path[idx];
+                  }
                 }
+    
+                let itemId = '';
+                
+                const uri = endPoint + "/sites/"+ siteId + path + formatPath;
+                if (beforeUri === uri) {
+                  itemId = beforeItemId;
+                }
+                else {
+                  try {
+                    const sitesInfo = await axios.get(uri, options);
+                    itemId = sitesInfo.data.id;
+                    beforeUri = uri;
+                    beforeItemId = itemId; 
+                  }
+                  catch(error) {
+                    console.log(error);
+                    res.json({success:'F', message: '파일 업로드 작업 중 오류가 발생했습니다.<br>에러 : ' + JSON.stringify(error.message)});
+                  }
+                }
+    
+                promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+originName+':/content', labelFile, options));
+                // console.log(labelFile);
+                // const labelData = await setLabelFiles(param);
+                // const fileData = Buffer.from(file.buffer).toString('base64');
+                // const param = {
+                //   apiKey: gateWayKey,
+                //   email: req.session.account.idTokenClaims.email,
+                //   dispFileName: originName,
+                //   aipGuid: "878173ae-cc36-4881-af57-604af868314c",
+                //   comment: "",
+                //   fileData: fileData
+                // }
+
+                // try {
+                //   const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param);
+                //   if (result) {
+                //     if (result.data.statusCode === 200 && !result.data.result.errorCode) {
+                //       let bufferValue = Buffer.from(result.data.result.fileData, "base64");
+                //       file = bufferValue;
+                //     }
+                //     else {
+                //       console.log(result.data);
+                //       return res.json({success:'F', message: '파일명 : ' + originName + '<br>에러 : ' + result.data.result.errorMessage});
+                //     }
+                //   }
+                // }
+                // catch(error) {
+                //   console.log(error);
+                // }
               }
             }
 
-            let formatPath = '';
-            if (filePath) {
-              if (Array.isArray(filePath) && filePath.length > 0) {
-                formatPath = filePath[0];
-                if (filePath.length > 1) {
-                  req.body[ fileName + "_path"] = filePath.splice(1); 
-                }
-              }
-              else if (filePath.trim()){
-                formatPath = filePath;
-              }
+
+            // console.log(labelData.data);
+            // return res.json({message:'test'});
+
+            // let formatPath = '';
+            // if (filePath) {
+            //   if (Array.isArray(filePath) && filePath.length > 0) {
+            //     formatPath = filePath[0];
+            //     if (filePath.length > 1) {
+            //       req.body[ fileName + "_path"] = filePath.splice(1); 
+            //     }
+            //   }
+            //   else if (filePath.trim()){
+            //     formatPath = filePath;
+            //   }
               
-              if (!path.includes(":")) {
-                formatPath = ":" + formatPath;
-              }
-            }
+            //   if (!path.includes(":")) {
+            //     formatPath = ":" + formatPath;
+            //   }
+            // }
 
-            let itemId = '';
-            const uri = endPoint + "/sites/"+ siteId + path + formatPath;
+            // let itemId = '';
+            // const uri = endPoint + "/sites/"+ siteId + path + formatPath;
             
-            if (beforeUri === uri) {
-              itemId = beforeItemId;
-            }
-            else {
-              const sitesInfo = await axios.get(uri, options);
-              itemId = sitesInfo.data.id;
-              beforeUri = uri;
-              beforeItemId = itemId; 
-            }
-
-            promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+originName+':/content', file, options));
+            // if (beforeUri === uri) {
+            //   itemId = beforeItemId;
+            // }
+            // else {
+            //   const sitesInfo = await axios.get(uri, options);
+            //   itemId = sitesInfo.data.id;
+            //   beforeUri = uri;
+            //   beforeItemId = itemId; 
+            // }
+
+            // promiseArray.push(axios.put(endPoint + "/sites/"+ siteId +"/drive/items/"+itemId+':/'+originName+':/content', file, options));
           }
         }
         if (promiseArray.length > 0) {
@@ -787,7 +975,7 @@ serverApp.post('/api/download',
                     fileData: file
                   }
                   
-                  const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/delete-label', param);
+                  const result = await axios.post(apiUrl + '/api/v1/stream/delete-label', param);
                   if (result && result.data.statusCode === 200 && !result.data.result.errorCode) {
                       decodeFile = result.data.result.fileData;
                   }
@@ -913,7 +1101,7 @@ serverApp.post('/api/folderMove', async (req, res, next)=>{
 })
 
 async function findSubFolder(data, movePath, moveSiteId, options) {
-    let resultType = true;
+    let resultType = false;
     try {
       const moveItem = await axios.get(movePath, options);
 
@@ -938,9 +1126,7 @@ async function findSubFolder(data, movePath, moveSiteId, options) {
                       const children = childrenValues[ii];
                       if (children && children.folder) {
                           const result = await findSubFolder(children, makeFolderPath, moveSiteId, options);
-                          if (!result) {
-                            resultType = result;
-                          }
+                          resultType = result;
                       }
                       else {
                           const dataUrl = children['@microsoft.graph.downloadUrl'];
@@ -949,42 +1135,26 @@ async function findSubFolder(data, movePath, moveSiteId, options) {
                           },});
                           if (response.data) {
                             const file = response.data;
-                            const uploadResult = await axios.put(`${endPoint}/sites/${moveSiteId}/drive/items/${makeFolderData.data.id}:/${children.name}:/content`, file.buffer, options);
-                            if (!uploadResult) {
-                              resultType = false;
+                            const uploadResult = await axios.put(`${endPoint}/sites/${moveSiteId}/drive/items/${makeFolderData.data.id}:/${children.name}:/content`, 
+                                                                  file.buffer, options);
+                            if (uploadResult) {
+                              resultType = true;
                             }
                           }
-                          else {
-                            resultType = false;
-                          }
                       }
                   }
                 }
-                else {
-                  resultType = false;
-                }
-              }
-              else {
-                resultType = false;
               }
             }
-            else {
-              resultType = false;
-            }
-        }
-        else {
-          resultType = false;
         }
     }
-    else {
-      resultType = false;
-    }
-    return resultType;
+    
   }
   catch(error) {
     console.log(error);
-    return false;
+    return resultType;
   }
+  return resultType;
 }
 
 function createZipFile(obj, zip) {
@@ -1063,7 +1233,7 @@ serverApp.post('/api/getPossibleExtList', async (req, res, next)=>{
     }
     catch(error) {
       console.log(error);
-      res.status(500);
+      res.status(error.status);
       res.send(error);
     }
   }
@@ -1330,6 +1500,7 @@ async function getPossibleExt() {
     try {
       const query = await pool;
       const result = await query.request().query(sqlQuery);
+      
       if (result && result.recordset.length) {
         resultObj.success = 'S';
         resultObj.message = 'Success';
@@ -1341,6 +1512,7 @@ async function getPossibleExt() {
       }
     }
     catch(error) {
+      // console.log(error);
       console.log(error);
       resultObj.success = 'F';
       resultObj.message = JSON.stringify(error);
@@ -1377,8 +1549,6 @@ async function setLabelFile(session, file, supported_file_ext) {
       }
 
       const fileData = Buffer.from(file.buffer).toString('base64');
-      console.log('=================fileData =================================');
-      console.log(fileData);
       const param = {
         apiKey: gateWayKey,
         email: session.account.idTokenClaims.email,
@@ -1389,7 +1559,7 @@ async function setLabelFile(session, file, supported_file_ext) {
       }
       
       try {
-        const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/set-label', param);
+        const result = await axios.post(apiUrl + '/api/v1/stream/set-label', param);
         if (result) {
           if (result.data.statusCode === 200 && !result.data.result.errorCode) {
             resultObj.fileData = Buffer.from(result.data.result.fileData, "base64");
@@ -1427,7 +1597,7 @@ async function deleteLabelFile(session, name, file) {
       fileData: file
     }
     
-    const result = await axios.post('http://192.168.20.99:5050/api/v1/stream/delete-label', param);
+    const result = await axios.post(apiUrl + '/api/v1/stream/delete-label', param);
     if (result && result.data.statusCode === 200 && !result.data.result.errorCode) {
         resultObj.fileData = result.data.result.fileData;
     }
@@ -1452,6 +1622,19 @@ function getOptions(token) {
   return options;
 }
 
+serverApp.use((err, req, res, next)=>{
+  console.log(err.message);
+  console.log(err);
+  console.log(res.statusCode);
+  if (err) {
+    res.status(400);
+    res.json({message: err.message});
+  } else {
+    res.status(500);
+    res.json({message: err.message});
+  }
+})
+
 server.listen(SERVER_PORT, function () {
   console.log(`\n${serverApp.name} listening to ${SERVER_PORT}`);
 }); 

+ 1 - 1
src/config/sql.js

@@ -9,7 +9,7 @@ const connPool = new sql.ConnectionPool(config.dbconfig)
     })
     .catch((error)=>{
         console.log(error);
-    })
+    });
 
 module.exports = {
     sql : sql,

+ 57 - 13
src/views/hello.html

@@ -87,7 +87,14 @@
   });
 
   $(()=>{
-
+    const result = $.ajax({method: 'post', url: '/api/getPossibleExtList'
+      ,success : (res)=> {
+        console.log(res);
+      }
+      ,error : (err) => {
+        console.log(err);
+      }
+    });
     microsoftTeams.app.initialize().then(() => {
       getClientSideToken()
       .then((clientSideToken) => {
@@ -1123,7 +1130,7 @@
       let siteId = getSitesId();
 
       if (!siteId) {
-        return alertMessage('파일 삭제','그룹 정보를 확인 할 수 없습니다.');
+        return alertMessage('파일 삭제','그룹 정보를 확인 할 수 없습니다.', null, 'red');
       }
       if (checkArr.length > 0) {
         for (let ii = 0; ii < checkArr.length; ii++) {
@@ -1134,7 +1141,7 @@
             if (idx >= 0) {
               const sameIndex = team.items[team.teams[idx].id].findIndex(obj => obj.id === checkArr.eq(ii).val());
               if (sameIndex >= 0) {
-                return alertMessage('파일 삭제', '채널 정보는 삭제하실수 없습니다.');
+                return alertMessage('파일 삭제', '채널 정보는 삭제하실수 없습니다.', null, 'red');
               };
             }
 
@@ -1142,7 +1149,7 @@
           }
         }
         if (checkedArr.length === 0) {
-          alertMessage('파일 삭제', '선택된 정보가 없습니다. 삭제하실 파일을 먼저 선택해주세요.');
+          alertMessage('파일 삭제', '선택된 정보가 없습니다. 삭제하실 파일을 먼저 선택해주세요.', null, 'red');
         }
         else {
           confirmMessage('파일 삭제', '선택된 파일을 삭제하시겠습니까?', ()=>{
@@ -1154,11 +1161,13 @@
                   itemIds : JSON.stringify(checkedArr),
                 },
                 success: (res)=> {
+                  let color = 'red';
                   if (res.success === 'S') {
                     refreshDrives();
+                    color = '';
                   }
                   $('.modal').remove();
-                  alertMessage('파일 삭제', res.message);
+                  alertMessage('파일 삭제', res.message, null, color);
                 },
                 error: (error)=> {
                   console.log(error);
@@ -1343,6 +1352,7 @@
         const folders = formData.getAll('folder');
         const files = formData.getAll('file');
         const alertTitle = '파일 업로드';
+    
         if (folders.length === 0 && files.length === 0) return;
         
         if (folders && folders.length > 100) {
@@ -1361,7 +1371,43 @@
         const pathArr = $('.panel').children();
 
         if (groupIndex >= 0 && $('.panel').children().length === 1) {
-          return alertMessage(alertTitle,'채널에는 업로드 할 수 없습니다. 채널 리스트를 먼저 선택해 주세요.', null, 'red');
+          return alertMessage(alertTitle, '채널에는 업로드 할 수 없습니다. 채널 리스트를 먼저 선택해 주세요.', null, 'red');
+        }
+
+        try {
+          const result = await $.ajax({method: 'post', url: '/api/getPossibleExtList'});
+          
+          if (result.success === 'S' && result.data) {
+            const { supported_file_ext } = result.data;
+            if (supported_file_ext) {
+              const supportedFileExtArr = supported_file_ext.split(';');
+              if (supportedFileExtArr.length > 0) {
+                const lastIndex = supportedFileExtArr.length - 1;
+                const lastValue = supportedFileExtArr[lastIndex];
+                if (!lastValue) {
+                  supportedFileExtArr.splice(lastIndex);
+                }
+                if (files.length > 0) {
+                  for (let file of files) {
+                    if (file && file.name) {
+                      let ext = file.name.substring(file.name.lastIndexOf('.'), file.name.length);
+                      console.log(ext);
+                      if (!supportedFileExtArr.includes(ext)) {
+                        return alertMessage(alertTitle, '파일명 : '+ file.name 
+                        + '<br>해당 파일은 업로드 불가 파일입니다. 다시 시도해주세요.<br>가능 확장자 :' + JSON.stringify(supportedFileExtArr), null, 'red');
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+          else {
+            return alertMessage(alertTitle, '가능 확장자 정보를 불러올 수 없습니다.', null, 'red');
+          }
+        }
+        catch (error) {
+          return alertMessage(alertTitle, '가능 확장자 확인 중 오류가 발생했습니다. 오류 : ' + JSON.stringify(error), null, 'red');
         }
 
         let sitePath = getDrivePath();
@@ -1379,10 +1425,7 @@
             let str = res.message;
             let color = null;
             if (res.success === 'F') {
-            // if (res.error) {
-              // str += '<br>오류 : ' + res.error.message;
               color = 'red';
-              // str = res.errorMessage;
             }
             alertMessage(alertTitle, str, null, color);
             refreshDrives();
@@ -1560,7 +1603,6 @@
             let dirReader = item.createReader();
             const path = item.fullPath.substring(0, item.fullPath.lastIndexOf('/'));
             _formData.append('folder', JSON.stringify({name : item.name, path : path}));
-            console.log(path);
             dirReader.readEntries(entries => {
               let entriesPromises = [];
               fileObj = {
@@ -1895,11 +1937,13 @@
         name : nameVal,
       },
       success: (res) => {
-        alertMessage(name, res.message);
-        if (res.success === 'S') {
+        let isSuccess = res.success === 'S';
+        let color =  isSuccess ? '' : 'red';
+        if (isSuccess) {
           modalClose('make');
           refreshDrives();
         }
+        alertMessage(name, res.message, null, color);
       },
       error: (error) => {
         console.log('==============error=============\n');
@@ -2001,7 +2045,7 @@
               <div class="modal-content">
                 <div>이름</div>
                 <div style="display:flex; align-items:flex-end; user-select:none;">
-                  <input type="text" placeholder="새 이름을 입력하세요." style="width:'calc(100% - 35px)';" autocomplete='off' onkeyup="enterKey(()=>makeItems('ppt_input', 'PowerPoint 프레젠테이션', '/api/makePptx', '.pptx'), event)" name="change_name" id="ppt_input" value="">&nbsp;.docx
+                  <input type="text" placeholder="새 이름을 입력하세요." style="width:'calc(100% - 35px)';" autocomplete='off' onkeyup="enterKey(()=>makeItems('ppt_input', 'PowerPoint 프레젠테이션', '/api/makePptx', '.pptx'), event)" name="change_name" id="ppt_input" value="">&nbsp;.pptx
                 </div>
               </div>
               <div class="button-box">