我正在为客户编写应用程序,他们应该能够上传产品的图像和文档。
html 表单/字段集有两个文件输入。一张用于图像,另一张用于文档。
input.product-upload-images(
type="file",
multiple="multiple",
value="images",
accept="image/png, image/jpg ,image/jpeg")
input.product-upload-documents(
type="file",
multiple="multiple",
value="Documents",
accept="application/pdf")
在我的 POST/PUT 控制器中,我想使用中间件检查字段
images[]
中的所有文件是否都是 MIME 类型 image/...
以及字段 documents[]
中的所有文件是否都是 MIME 类型 image/pdf
。
我删除了一些中间件,例如护照中间件或数据验证中间件,以提供一个易于理解的示例。
const uploadPath = path.join('some', 'path');
const upload = multer({
dest: uploadPath,
fileFilter: (req, file, cb) => {
// filter filetype by field
}
});
const uploadMiddleware = upload.fields([
{name: 'documents[]', maxCount: 10},
{name: 'images[]', maxCount: 10}
]);
// ...
router.post(
'/',
uploadMiddleware,
async (req, res, next) => {
// ...
如何实现文件过滤器,可以过滤文件类型的某个字段?
我将继续修改您的代码,以包含用于多个字段上传的
fileFilter
回调函数的实现。
...
const upload = multer({
dest: uploadPath,
fileFilter: (req, file, cb) => {
// filter filetype by field - `file` will all be a single File object
if (['image/png', 'image/jpeg', 'application/pdf'].include(file.mimetype)) {
cb(null, true);
} else {
cb(new Error('unknown file type.'));
}
});
...
需要注意的是,由于上传是字段 - 每个字段可以包含多种文件类型,multer 会将 fileFilter 回调中的所有字段转储为单个文件对象而不是数组,它通过调用每个文件的 fileFilter 回调。但是,在您的控制器中,您将对字段进行排序并正确添加到数组中。
例如,假设
document
字段和 image
字段分别包含 3 个和 2 个文件,那么 multer 将在 fileFilter 回调函数中列出 5 个对象,并在控制器(最终中间件处理程序)中创建一个带有键 的对象数组documents
和 images
:req.files 将打印以下对象。
[Object: null prototype] {
documents: [
{
fieldname: 'documents',
originalname: 'doc.pdf',
encoding: '7bit',
mimetype: 'document/pdf',
...
},
{},
{}
],
images: [
{
fieldname: 'image1',
originalname: 'avatar.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
...
},
{}
]
}
注意 在以下代码片段中:
const uploadMiddleware = upload.fields([
{name: 'documents[]', maxCount: 10},
{name: 'images[]', maxCount: 10}
]);
我假设
{ name: 'documents[]', maxCount: 10 }
和 { name: 'images[]', maxCount: 10 }
为 { name: 'documents', maxCount: 10 } and { name: 'images', maxCount: 10 }
您还可以通过回调指定目的地。
const exampleMimeType = 'image'
const storage = multer.destination({
destination: (req, file, cb) => {
if(file.mimeType === exmpleMimeType){
cb(null, `/files/${exampleMimeType}`)
}
}
})