在控制器中使用 Express 和 Multer 解析请求

Parse request with Express and Multer within controller

我的项目中可以上传图片,但我想稍微整理一下。

理想情况下,我希望我的图片上传在函数或控制器中完成。我之前已经让 multer 在我的路由文件中完成了图像上传。像这样:

route.js:

var upload = multer({
    storage: multer.diskStorage({
        destination: function(req, file, cb) {
            cb(null, 'public/cms/images/uploads')
        },
        filename: function(req, file, cb) {
            cb(null, randomString.generate({length: 7, charset: 'alphanumeric'}) + path.extname(file.originalname))
        }
    })
})

router.post('/fileupload', login_controller.requires_login, upload.single('imagefile'), test_controller.file_upload_post);

这种作品。这个问题是,我需要对可以上传的内容设置一些限制,并在模板上显示错误消息。如果我把它从我的路线文件中分离出来,这会更整洁。

为什么这行不通?

我正在一个名为 "upload_image" 的控制器中创建一个函数,并在路由中调用它。

route.js:

router.post('/blogpost/create', blog_controller.upload_image, blog_controller.blog_create_post);

blogController.js:

exports.upload_image = function (req, res, next) {

    var upload = multer({
        storage: multer.diskStorage({
            destination: function (req, file, cb) {
                cb(null, 'public/cms/images/uploads')
            },
            filename: function (req, file, cb) {
                cb(null, randomString.generate({ length: 7, charset:  'alphanumeric' }) + path.extname(file.originalname))
            }
        })
    })

    upload.single('imagefile');

    return next();

}

当我这样做时,req.body 和 req.file 是未定义的。没有图像被上传。没有错误消息,除了我使用 req.body 或 req.file.

的任何地方,模板呈现正常

multer不会用表单数据修改req对象吗?这是否意味着我可以在使用 next() 之后将它转发到我的其他控制器。我想 blog_controller.blog_create_post 然后根据请求执行我需要的所有其他操作。

谢谢,希望能帮到你。

调用 upload.single('imagefile') 什么都不做。这相当于做:

exports.upload_image = function (req, res, next) {
    var upload = multer({
        storage: multer.diskStorage({
            destination: function (req, file, cb) {
                cb(null, 'public/cms/images/uploads')
            },
            filename: function (req, file, cb) {
                cb(null, randomString.generate({ length: 7, charset:  'alphanumeric' }) + path.extname(file.originalname))
            }
        })
    })

    function (req, res, next) {}

    return next();

}

记住 multer 只是中间件。 multer 所采用的确切逻辑显示为 here

因此,如果我正确理解了 multer 的来源,这样的事情可能会奏效:

exports.upload_image = function (req, res, next) {
    var upload = multer({
        storage: multer.diskStorage({
            destination: function (req, file, cb) {
                cb(null, 'public/cms/images/uploads')
            },
            filename: function (req, file, cb) {
                cb(null, randomString.generate({ length: 7, charset:  'alphanumeric' }) + path.extname(file.originalname))
            }
        })
    })

    returnupload.single('imagefile')(req, res, next)

    return next();

}

我没有测试过,但类似的东西。