文件未上传且 multer-sftp 没有错误

File not uploaded and no error from multer-sftp

这种存储对我来说似乎不起作用。 我正确配置了所有内容,我可以通过 WinSCP 或 Putty 使用相同的凭据连接到我的 SFTP 服务器,但是当通过此库上传文件时,没有显示任何错误,代码似乎工作正常,但服务器上没有文件。

const multer = require('multer');
const sftpStorage = require('multer-sftp');

const storage = sftpStorage({
    sftp: {
        host: process.env.CDN_HOST,
        port: 22,
        username: process.env.CDN_USERNAME,
        password: process.env.CDN_PASSWORD,
    },
    destination: function(req, file, cb) {
        cb(null, `${process.env.CDN_BASEPATH}/folder`); // /var/www/CDN/folder
    },
    filename: function(req, file, cb) {
        const extension = path.extname(file.originalname);
        if (req.fileId) { // req.fileId is set as a MongoDB object id
            cb(null, req.fileId + extension);
        } else {
            cb(null, file.originalname);
        }
    }
});

const upload = multer({
    storage: storage,
    limits: {
        fieldSize: 8 * 1000000, // 8 MB in bytes
    },
    fileFilter: function(req, file, cb) {
        if (file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png' && file.mimetype !== 'image/gif') cb(new Error("IMG_EXT_UNSUPPORTED"), false);
        else cb(null, true);
    },
}).single('image');

/* Then, in my request */
upload(req, res, function(err) {
    console.log(err); // undefined
});

上传执行无任何错误,但文件不存在。我想知道为什么会这样。

永远不会调用文件过滤器、文件名和目标函数,并且永远不会执行放置在这些函数中的任何日志。相反,在上传调用之前和之后以及在其回调中执行的任何 console.log 都可以正常工作。似乎上传从未尝试处理文件。

问题出在哪里?

编辑: 我注意到我正在使用 formidable 来解析多部分字段(包括图像),然后,仅在验证这些字段之后,调用函数“上传”。难不成是 formidable 的解析图与 multer 不兼容?如果是这样我该怎么办?

Afaik,你不应该把 formidable 和 multer 混在一起。可能 formidable 已经解析了请求,multer 将不会使用任何东西。尝试删除 formidable 并只使用 multer,例如

const upload = multer({
    storage: storage,
    limits: {
        fieldSize: 8 * 1000000, // 8 MB in bytes
    },
    fileFilter: (req, file, cb) => {
        if (file.mimetype !== 'image/jpg' && file.mimetype !== 'image/jpeg' && file.mimetype !== 'image/png' && file.mimetype !== 'image/gif') cb(new Error("IMG_EXT_UNSUPPORTED"), false);
        else cb(null, true);
    },
});

app.post('/your-upload-route', upload.single('image'), (req, res, next) => {
  // req.file should hold the `image` here
  // req.body will hold the text fields, if there were any
})