我使用 multer 来处理多文件上传,以及中间件“文件名”,如下所示:
filename: async (req, file, cb) => {
console.log(Object.keys(file));
({ rows } = await db.query(`
INSERT INTO public.files(
uuid,
nom,
type,
size
)
VALUES
($1, $2, $3, $4)
RETURNING *`, [
req.uuid,
file.originalname,
file.mimetype,
file.size,
// +req.headers["content-length"],
]));
cb(null, uuid);
},
问题在于
file.size
仍未定义。在将文件发送到 API 之前,我会控制大小是否存在。当我检查哪些属性可用时(参见 console.log
),我只有 'fieldname', 'originalname', 'encoding', 'mimetype'
。
如果我使用
+req.headers["content-length"]
,它会考虑所有请求(所有文件)的大小,而不仅仅是当前文件。
为什么我看不到文件大小?这是不可能的还是我应该编辑一些我在文档中没有找到的设置?
感谢@traynor,这就是我所做的:
上传后我添加了一个中间件:
router.post('/',
upload.array('files'),
handleFiles,
...
我简化了上传:
const storage = multer.diskStorage({
destination: async (req, file, cb) => {
let folder = config.get('api.files');
req.uuid = uuid.v4();
folder += `/${req.uuid.charAt(0)}/${req.uuid.charAt(1)}/`;
await fsPromises.mkdir(folder, { recursive: true });
cb(null, folder);
},
filename: async (req, file, cb) => {
cb(null, req.uuid);
},
});
const upload = multer({ storage });
我用新的中间件处理逻辑:
const handleFiles = async (req, res, next) => {
// my logic here, with req.files having f.size for each file
// and f.originalname anf f.filename
next();
}