diff --git a/mariadb-v2-260106.zip b/mariadb-v2-260106.zip deleted file mode 100644 index e5587ec..0000000 Binary files a/mariadb-v2-260106.zip and /dev/null differ diff --git a/package-lock.json b/package-lock.json index f4724f3..b69645a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "cors": "^2.8.5", + "crypto": "^1.0.1", "dotenv": "^17.2.3", "express": "^5.2.1", "helmet": "^8.1.0", @@ -408,6 +409,13 @@ "node": ">=12.0.0" } }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", + "license": "ISC" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", diff --git a/package.json b/package.json index f79d1ef..d91af5d 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js", - "dev": "nodemon server.js" + "dev": "nodemon server.js" }, "keywords": [], "author": "", @@ -14,6 +14,7 @@ "type": "commonjs", "dependencies": { "cors": "^2.8.5", + "crypto": "^1.0.1", "dotenv": "^17.2.3", "express": "^5.2.1", "helmet": "^8.1.0", diff --git a/server.js b/server.js index 2ead2a9..df27f6e 100644 --- a/server.js +++ b/server.js @@ -64,7 +64,12 @@ app.post(ormRoutes, async (req, res, next) => { app.post('/upload/:dbname/:typeid', upload.single('file'), (req, res) => { if (!req.file) return res.status(400).json({ status: 400, msg: 'No file' }); - const fileUrl = `/static/upload/${req.params.dbname}/${req.params.typeid}/${req.file.filename}`; + //const fileUrl = `/static/upload/${req.params.dbname}/${req.params.typeid}/${req.file.filename}`; + + // 改為完整的 Server IP + const serverRoot = 'https://api.gex.com.tw:8033/upload'; + const fileUrl = `${serverRoot}/${req.params.dbname}/${req.params.typeid}/${req.file.filename}`; + res.json({ status: 0, data: { value: fileUrl, url: fileUrl }, msg: 'success' }); }); diff --git a/src/config/db.js b/src/config/db.js index 24a8729..021104b 100644 --- a/src/config/db.js +++ b/src/config/db.js @@ -11,7 +11,8 @@ const pool = mysql.createPool({ connectionLimit: 15, // 憓雿萇潸賢 queueLimit: 0, multipleStatements: true, - timezone: '+08:00' // 撘瑕嗆銝 + charset: 'utf8mb4', // 蝣箔銝銵摮 + timezone: '+08:00' // 撘瑕嗆銝 }); // 皜祈岫 diff --git a/src/services/ormService.js b/src/services/ormService.js index 02c4c6e..4799c42 100644 --- a/src/services/ormService.js +++ b/src/services/ormService.js @@ -246,10 +246,14 @@ class OrmService { if (spName === 'get_treedata' || spName === 'get_assignData') { finalParams = [...orderedParas, "''"]; } - // get_treedata 喳3 - //if (spName === 'zen_showsource') { - // finalParams = [...orderedParas, "''"]; - //} + // get_treedata 喳3(喳 [_flow_level, _tag, para01, para02, para03]) + if (spName === 'zen_showsource' || spName === 'zen_updatesource') { + finalParams = [body.para01, body.para02, body.para03]; + } + // + if (spName === 'zen_create_json_v2') { + finalParams = [body.para01, body.para02]; + } return finalParams; } diff --git a/src/services/uploadService.js b/src/services/uploadService.js index 85595e3..210e344 100644 --- a/src/services/uploadService.js +++ b/src/services/uploadService.js @@ -1,6 +1,7 @@ const multer = require('multer'); const fs = require('fs'); const path = require('path'); +const crypto = require('crypto'); // 冽潛冽摮銝 const storage = multer.diskStorage({ destination: (req, file, cb) => { @@ -10,8 +11,45 @@ const storage = multer.diskStorage({ cb(null, uploadPath); }, filename: (req, file, cb) => { - const dateStr = new Date().toISOString().replace(/[:.]/g, '-'); - cb(null, `${dateStr}-${file.originalname}`); + //銝銵蝔撘芸交交 tag 冽, 桀瘨 2026/01/10 + //const dateStr = new Date().toISOString().replace(/[:.]/g, '-'); + //cb(null, `${dateStr}-${file.originalname}`); + + // 閫瘙箔葉鈭蝣澆憿嚗撠 latin1 頧 utf-8 + //const originalName = Buffer.from(file.originalname, 'latin1').toString('utf8'); + //cb(null, `${file.originalname}`); + + + // 1. 敺憪瑼舀 + const ext = path.extname(file.originalname); // 恍嚗靘憒 .jpg + const baseName = path.basename(file.originalname, ext); // 芣銝餅 + + // 2. 甇銵券撘嚗斗瑟臬衣箇望詻摨蝺璈怎 + // ^[a-zA-Z0-9_-]+$ 銵函內敺剖啣偏賣航望豢摨蝺璈怎 + const isAlphaNumeric = /^[a-zA-Z0-9_-]+$/.test(baseName); + + let finalFileName = ''; + //const dateStr = new Date().toISOString().replace(/[:.]/g, '-'); + const dateStr = new Date().toISOString().replace(/\D/g, ''); + + if (isAlphaNumeric) { + // A. 憒舐望賂靽璅嚗~~銝喲脫迫銴~~ + //finalFileName = `${dateStr}-${file.originalname}`; + finalFileName = `${file.originalname}`; + } else { + // B. 憒思葉嗡摮 + // 靽桀儔 Multer 蝺函Ⅳ航炊 (latin1 -> utf8) + const decodedName = Buffer.from(file.originalname, 'latin1').toString('utf8'); + + // 箔蝟餌絞蝛拙嚗蝖祉蝡臬脣遣霅唳寧具冽望詻脫迫 URL 蝺函Ⅳ憿 + const uniqueSuffix = crypto.randomBytes(4).toString('hex'); + finalFileName = `${dateStr}-${uniqueSuffix}${ext}`; + + // 撠甇蝣箇銝剜蝔望頛嚗靘 Controller 摮亥摨思蝙 + file.decodedOriginalName = decodedName; + } + + cb(null, finalFileName); } });