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中作为“文件”发送,而当使用单个文件时,则是“文件”
我期待着,如果有人帮助调试哪里是服务器上的问题。
1条答案
按热度按时间6yjfywim1#
req.files
在处理后是可用的,所以在filename
函数中使用while
循环阅读req.files
是没有意义的,这意味着您需要完全删除多个存储处理程序,而只使用单个,并确定每个路由的单个和多个文件上传。如果需要
filepatharray
,可以从req.files
中提取不同的是,对于多个文件,文件存储在
req.files
中,而对于单个文件存储在req.file
中,所以在您的情况下,您可能根本不需要单个文件。