mongodb Multer中间件在本地服务器上工作,但在服务器上运行一次后进入挂起状态/挂起

lsmd5eda  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(122)

Multer中间件有问题,我创建了中间件,并将静态Express文件设置到Uploads文件夹中。
Index.js文件

import emailroutes from './routes/emailroutes.js'

app.use(express.json({ limit: '25mb' }));
app.use(express.urlencoded({ extended: false, limit: '25mb' }));
app.use('/uploads', express.static(path.join('uploads')));
app.use('/email', emailroutes);

然后在routes文件中,使用multer作为中间件

import EmailController from '../controller/EmailController.js'
import { storageMultiple } from '../helpers/storage.js'
router.post('/', protect, storageMultiple, EmailController.postEmail)

Multer中间件功能如下。

import multer from 'multer';
import md5 from 'md5';
var filepatharray = [];

const diskStorageMultiple = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads');
    },
    filename: (req, file, cb) => {
        while (i < req.files.length) {
            filepath = md5(Date.now() + i)
            const mimeType = file.mimetype.split('/');
            var fileType = mimeType[1];
            if (fileType == 'vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
                fileType = 'xlsx'
            } else if (fileType == 'text/plain') {
                fileType = 'txt'
            } else if (fileType == 'text/csv') {
                fileType = 'csv'
            } else if (fileType == 'vnd.ms-excel') {
                fileType = 'xls'
            } else if (fileType == 'vnd.openxmlformats-officedocument.wordprocessingml.document') {
                fileType = 'docx'
            } else if (fileType == 'msword') {
                fileType = 'doc'
            } else if (fileType == 'vnd.openxmlformats-officedocument.presentationml.presentation') {
                fileType = 'pptx'
            } else if (fileType == 'vnd.ms-powerpoint') {
                fileType = 'ppt'
            }
            const fileName = filepath + '.' + fileType;
            filepatharray.push({
                path: filepath + '.' + fileType,
                name: file.originalname
            })

            cb(null, fileName);
            i++;
        }
    },
});
const fileFilter = (req, file, cb) => {
    cb(null, true)
};

const storageMultiple = multer({
    storage: diskStorageMultiple,
    fileFilter: fileFilter).array(
    'files'
);

export { storageMultiple , filepatharray}

当我改变这个单一的文件上传,它的工作很好,以下是为单一文件multer的代码。

const diskStorage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, './uploads');
    },
    filename: (req, file, cb) => {
        filepath = md5(Date.now() + req.user.id)
        const mimeType = file.mimetype.split('/');
        var fileType = mimeType[1];
        if (fileType == 'vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
            fileType = 'xlsx'
        } else if (fileType == 'text/plain') {
            fileType = 'txt'
        } else if (fileType == 'text/csv') {
            fileType = 'csv'
        } else if (fileType == 'vnd.ms-excel') {
            fileType = 'xls'
        } else if (fileType == 'vnd.openxmlformats-officedocument.wordprocessingml.document') {
            fileType = 'docx'
        } else if (fileType == 'msword') {
            fileType = 'doc'
        } else if (fileType == 'vnd.openxmlformats-officedocument.presentationml.presentation') {
            fileType = 'pptx'
        } else if (fileType == 'vnd.ms-powerpoint') {
            fileType = 'ppt'
        }
        const fileName = filepath + '.' + fileType;
        filepath = filepath + '.' + fileType
        cb(null, fileName);
    },
});
const storage = multer({ storage: diskStorage, fileFilter: fileFilter }).single(
    'file'
);

当我使用多个文件时,我将在multer中作为“文件”发送,而当使用单个文件时,则是“文件”
我期待着,如果有人帮助调试哪里是服务器上的问题。

6yjfywim

6yjfywim1#

req.files在处理后是可用的,所以在filename函数中使用while循环阅读req.files是没有意义的,这意味着您需要完全删除多个存储处理程序,而只使用单个,并确定每个路由的单个和多个文件上传。

const storage = multer({ storage: diskStorage, fileFilter: fileFilter })

// single
router.post('/', protect, storage.single('file'), EmailController.postEmail)

// multiple
router.post('/', protect, storage.array('files'), EmailController.postEmailWithMultipleFiles)

如果需要filepatharray,可以从req.files中提取
不同的是,对于多个文件,文件存储在req.files中,而对于单个文件存储在req.file中,所以在您的情况下,您可能根本不需要单个文件。

相关问题