Преглед изворни кода

feat: 新增上传的后缀限制

caipin пре 3 часа
родитељ
комит
847dea63d9

+ 34 - 1
app/controller/file_controller.js

@@ -12,6 +12,10 @@ const sendToWormhole = require('stream-wormhole');
 const path = require('path');
 const advanceConst = require('../const/advance');
 
+const FILE_MANAGEMENT_EXTRA_EXTENSIONS = [
+    '.sbp', '.jygs', '.gkgs', '.sjgs', '.sgys', '.qdys', '.gcjs', '.sjys',
+];
+
 module.exports = app => {
     class FileController extends app.BaseController {
 
@@ -27,6 +31,28 @@ module.exports = app => {
             return Number(ctx.session.sessionUser.is_admin) === 1;
         }
 
+        getFileUploadWhitelist(ctx) {
+            const defaultWhitelist = ctx.app.config.multipart.whitelist || [];
+            return Array.from(new Set(defaultWhitelist.concat(FILE_MANAGEMENT_EXTRA_EXTENSIONS).map(ext => ext.toLowerCase())));
+        }
+
+        isFileUploadExtensionAllowed(ctx, filename) {
+            const ext = path.extname(filename || '').toLowerCase();
+            return this.getFileUploadWhitelist(ctx).indexOf(ext) >= 0;
+        }
+
+        getFileUploadCheck(ctx) {
+            const whitelist = this.getFileUploadWhitelist(ctx);
+            return (fieldname, fileStream, filename) => {
+                if (!fileStream || !filename) return null;
+                const ext = path.extname(filename).toLowerCase();
+                if (whitelist.indexOf(ext) >= 0) return null;
+                const error = new Error(`资料管理不支持${ext || '无扩展名'}格式文件`);
+                error.status = 400;
+                return error;
+            };
+        }
+
         hasFilePermission(ctx, permissionKey) {
             if (this.isAdmin(ctx)) return true;
             const permission = ctx.service.subProjPermission.PermissionConst.file[permissionKey];
@@ -229,6 +255,7 @@ module.exports = app => {
             try {
                 const renderData = {
                     jsFiles: this.app.jsFiles.common.concat(this.app.jsFiles.file.filesjs),
+                    fileUploadWhitelist: this.getFileUploadWhitelist(ctx),
                 };
                 const allFiling = await ctx.service.filing.getValidFiling(ctx.params.id, 'all');
                 const canManageDir = this.hasFilePermission(ctx, 'manage_dir');
@@ -715,7 +742,10 @@ module.exports = app => {
         async uploadFile(ctx){
             let stream;
             try {
-                const parts = ctx.multipart({ autoFields: true });
+                const parts = ctx.multipart({
+                    autoFields: true,
+                    checkFile: this.getFileUploadCheck(ctx),
+                });
 
                 let index = 0;
                 const create_time = Date.parse(new Date()) / 1000;
@@ -819,6 +849,9 @@ module.exports = app => {
 
                 let result;
                 const fileInfo = path.parse(data.fileInfo.filename);
+                if (!this.isFileUploadExtensionAllowed(ctx, data.fileInfo.filename)) {
+                    throw `资料管理不支持${fileInfo.ext || '无扩展名'}格式文件`;
+                }
                 switch(data.type) {
                     case 'begin':
                         const create_time = Date.parse(new Date()) / 1000;

+ 2 - 2
app/public/js/filesjs.js

@@ -2067,7 +2067,7 @@ $(document).ready(function() {
             if (filterFiles.indexOf(file.name) >= 0) continue;
             if (file.size > 50 * 1024 * 1024) { toastr.error('上传文件大小超过50MB。'); return; }
             const fileext = '.' + file.name.toLowerCase().split('.').splice(-1)[0];
-            if (whiteList.indexOf(fileext) === -1) { toastr.error('仅支持office文档、图片、压缩包格式,请勿上传' + fileext + '格式文件。'); return; }
+            if (whiteList.indexOf(fileext) === -1) { toastr.error('仅支持造价文件、Office文档、图片、压缩包格式,请勿上传' + fileext + '格式文件。'); return; }
             formData.append('size', file.size);
             formData.append('file[]', file);
             count++;
@@ -2115,7 +2115,7 @@ $(document).ready(function() {
         if (!file) { toastr.error('未选择上传文件。'); return; }
         if (file.size > 500 * 1024 * 1024) { toastr.error('上传文件大小超过500MB。'); return; }
         const fileext = '.' + file.name.toLowerCase().split('.').splice(-1)[0];
-        if (whiteList.indexOf(fileext) === -1) { toastr.error('仅支持office文档、图片、压缩包格式,请勿上传' + fileext + '格式文件。'); return; }
+        if (whiteList.indexOf(fileext) === -1) { toastr.error('仅支持造价文件、Office文档、图片、压缩包格式,请勿上传' + fileext + '格式文件。'); return; }
 
         AliOss.uploadBigFile(file, 'file/upload/big', { filing_id: filingSjs.curFiling.id },
             { progressObj: $('#upload-big-file-progress'), resumeObj: $('#add-big-file-resume'), stopObj: $('#add-big-file-stop') },

+ 7 - 1
app/service/file.js

@@ -10,6 +10,11 @@
 
 const path = require('path');
 
+const COST_FILE_EXTENSIONS = [
+    '.cpd', '.ctd', '.yup', '.ybpx', '.sbp', '.jygs', '.gkgs', '.sjgs',
+    '.sgys', '.qdys', '.gcjs', '.sjys',
+];
+
 module.exports = app => {
     class File extends app.BaseService {
 
@@ -32,7 +37,8 @@ module.exports = app => {
             files.forEach(x => {
                 x.filepath = ossPath + x.filepath;
                 x.viewpath = helper.getPreviewPath(x.fileext, x.filepath);
-                x.fileext_str = helper.fileExtStr(x.fileext);
+                const fileExt = String(x.fileext || '').toLowerCase();
+                x.fileext_str = COST_FILE_EXTENSIONS.indexOf(fileExt) >= 0 ? '造价文件' : helper.fileExtStr(fileExt);
                 x.canEdit = x.user_id === userId;
             });
         }

Разлика између датотеке није приказан због своје велике величине
+ 3 - 3
app/view/file/file_modal.ejs


+ 1 - 1
app/view/file/filesjs.ejs

@@ -170,7 +170,7 @@
     let canUpload = false;
     const filing = JSON.parse(unescape('<%- escape(JSON.stringify(filing)) %>'));
     const category = JSON.parse(unescape('<%- escape(JSON.stringify(categoryData)) %>'));
-    const whiteList = JSON.parse('<%- JSON.stringify(ctx.app.config.multipart.whitelist) %>');
+    const whiteList = JSON.parse('<%- JSON.stringify(fileUploadWhitelist) %>');
     let canEdit = false;
     let canLockFile = false;
     const filingPermissionMap = JSON.parse(unescape('<%- escape(JSON.stringify(filingPermissionMap)) %>'));