文件未上传且 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
})
这种存储对我来说似乎不起作用。 我正确配置了所有内容,我可以通过 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
})