Node.js 如何使用Multer-S3从不同字段向AWS S3发送多个文件
我目前正在使用Postman,我需要将两个文件从两个不同的字段上传到AWS-S3;这就是它的样子: 这是我正在调用的API路由:Node.js 如何使用Multer-S3从不同字段向AWS S3发送多个文件,node.js,amazon-web-services,amazon-s3,multer,multer-s3,Node.js,Amazon Web Services,Amazon S3,Multer,Multer S3,我目前正在使用Postman,我需要将两个文件从两个不同的字段上传到AWS-S3;这就是它的样子: 这是我正在调用的API路由: router.route('/').post(uploadThumbnail, uploadVideo, createVideo); 该路由调用三个函数(应该返回邮递员请求的数据): 以下是另外两个功能(带有aws上传功能);一个用于缩略图,另一个用于视频url: const upload = multer({ storage: multerS3({ s
router.route('/').post(uploadThumbnail, uploadVideo, createVideo);
该路由调用三个函数(应该返回邮递员请求的数据):
以下是另外两个功能(带有aws上传功能);一个用于缩略图,另一个用于视频url:
const upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.AWS_BUCKET_NAME,
acl: 'public-read',
key: function(req, file, cb) {
const strOne = process.env.WEBSITE_NAME + '-';
const userId = req.user.id + '-';
const userEmail = req.user.email + '-';
const todaysDate = Date.now().toString() + '.';
const extension = file.mimetype.split('/')[1];
const finalStr = strOne.concat(userId, userEmail, todaysDate, extension);
cb(null, finalStr);
}
})
});
exports.uploadThumbnail = upload.single('thumbnail');
exports.uploadVideo = upload.single('video_url');
每次我运行post时,邮递员都会向我抛出以下错误:
{
"status": "error",
"error": {
"name": "MulterError",
"message": "Unexpected field",
"code": "LIMIT_UNEXPECTED_FILE",
"field": "video_url",
"storageErrors": [],
"statusCode": 500,
"status": "error"
},
"message": "Unexpected field",
"stack": "MulterError: Unexpected field\n at wrappedFileFilter (C:\\xampp\\htdocs\\myporn\\node_modules\\multer\\index.js:40:19)\n at Busboy.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\multer\\lib\\make-middleware.js:114:7)\n at Busboy.emit (events.js:198:13)\n at Busboy.EventEmitter.emit (domain.js:448:20)\n at Busboy.emit (C:\\xampp\\htdocs\\myporn\\node_modules\\busboy\\lib\\main.js:38:33)\n at PartStream.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\busboy\\lib\\types\\multipart.js:213:13)\n at PartStream.emit (events.js:198:13)\n at PartStream.EventEmitter.emit (domain.js:448:20)\n at HeaderParser.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:51:16)\n at HeaderParser.emit (events.js:198:13)\n at HeaderParser.EventEmitter.emit (domain.js:448:20)\n at HeaderParser._finish (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\HeaderParser.js:68:8)\n at SBMH.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\HeaderParser.js:40:12)\n at SBMH.emit (events.js:198:13)\n at SBMH.EventEmitter.emit (domain.js:448:20)\n at SBMH._sbmh_feed (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:159:14)\n at SBMH.push (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:56:14)\n at HeaderParser.push (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\HeaderParser.js:46:19)\n at Dicer._oninfo (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:197:25)\n at SBMH.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:127:10)\n at SBMH.emit (events.js:198:13)\n at SBMH.EventEmitter.emit (domain.js:448:20)\n at SBMH._sbmh_feed (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:188:10)\n at SBMH.push (C:\\xampp\\htdocs\\myporn\\node_modules\\streamsearch\\lib\\sbmh.js:56:14)\n at Dicer._write (C:\\xampp\\htdocs\\myporn\\node_modules\\dicer\\lib\\Dicer.js:109:17)\n at doWrite (_stream_writable.js:415:12)\n at writeOrBuffer (_stream_writable.js:399:5)\n at Dicer.Writable.write (_stream_writable.js:299:11)"
}
{
“状态”:“错误”,
“错误”:{
“名称”:“Multerror”,
“消息”:“意外字段”,
“代码”:“限制意外文件”,
“字段”:“视频url”,
“存储错误”:[],
“状态代码”:500,
“状态”:“错误”
},
“消息”:“意外字段”,
在Busboy.emit(events.js:198:13)\n在Busboy.EventEmitter.emit(domain.js:448:20)\n在Busboy.emit(events.js:198:13)\n在Busboy.EventEmitter.emit(domain.js:448:20)\n(C:\\xampp\\htdocs\\myporn\\node\u modules\\busboy\\lib\\main.js:38:33)\n在PartStream。(C:\\xampp\\htdocs\\myporn\\node\u modules\\busboy\\lib\\types\\multipart.js:213:13)\n在PartStream.emit(events.js:198:13)\n在PartStream.EventEmitter.emit(domain.js:448:20)\n在HeaderParser。(C:\\xampp\\htdocs\\myporn\\node\u modules\\dicer\\lib\\dicer.js:51:16)\n在HeaderParser.emit(events.js:198:13)\n在HeaderParser.EventEmitter.emit(domain.js:448:20)\n在HeaderParser.完成(C:\\xampp\\htdocs\\myporn\\node\u modules\\dicer\\lib\\HeaderParser.js:68:8)\n在SBMH。(C:\\xampp\\htdocs\\myporn\\node\u modules\\dicer\\lib\\HeaderParser.js:40:12)\n在SBMH.emit(events.js:198:13)\n在SBMH.EventEmitter.emit(domain.js:448:20)\n在SBMH.\u SBMH\u提要(C:\\xampp\\htdocs\\myporn\\node\u modules\\streamsearch\\lib\\SBMH.js:159:14)\n在SBMH.push(C:\\xampp\\htdocs\\myporn\\node\u modules\\streamsearch\\lib\\sbmh.js:56:14)\n在HeaderParser.push上(C:\\xampp\\htdocs\\myporn\\node\u modules\\dicer\\lib\\HeaderParser.js:46:19)\n在dicer上。\u oninfo(C:\\xampp\\htdocs\\myporn\\node\u modules\\dicer\\lib\\dicer.js:197:25)\n在sbmh上。(C:\\xampp\\htdocs\\myporn\\node\u modules\\dicer\\lib\\dicer.js:127:10)\n在SBMH.emit(events.js:198:13)\n在SBMH.EventEmitter.emit(domain.js:448:20)\n在SBMH.push的SBMH提要(C:\\xampp\\htdocs\\myporn\\node\u modules\\streamsearch\\lib\\SBMH.js:188:10)\n(C:\\xampp\\htdocs\\myporn\\node\u modules\\streamsearch\\lib\\sbmh.js:56:14)\n在Dicer写入(C:\\xampp\\htdocs\\myporn\\node\u modules\\Dicer\\lib\\Dicer.js:109:17)\n在doWrite(\u stream\u writeable.js:415:12)\n在writeOrBuffer(\u stream\u writeable.js:399:5)\n在Dicer.writeable.js:299:11)
}
该功能工作得很好,但只有当发送一个单一的文件,它可以是缩略图或视频链接,但不能两者兼而有之…我需要这两个领域的工作
有没有办法解决这个问题?const s3=new AWS.s3({
const s3 = new AWS.S3({
accessKeyId: 'xxxxxxxxx',
secretAccessKey: 'xxxxxxxxx'
});
const uploadS3 = multer({
storage: multerS3({
s3: s3,
acl: 'public-read',
bucket: 'xxxxxxxx',
metadata: (req, file, callBack) => {
callBack(null, { fieldName: file.fieldname })
},
key: (req, file, callBack) => {
var fullPath = 'products/' + file.originalname;//If you want to save into a folder concat de name of the folder to the path
callBack(null, fullPath)
}
}),
limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
fileFilter: function (req, file, cb) {
checkFileType(file, cb);
}
}).array('photos', 10);
exports.uploadProductsImages = async (req, res) => {
uploadS3(req, res, (error) => {
console.log('files', req.files);
if (error) {
console.log('errors', error);
res.status(500).json({
status: 'fail',
error: error
});
} else {
// If File not found
if (req.files === undefined) {
console.log('uploadProductsImages Error: No File Selected!');
res.status(500).json({
status: 'fail',
message: 'Error: No File Selected'
});
} else {
// If Success
let fileArray = req.files,
fileLocation;
const images = [];
for (let i = 0; i < fileArray.length; i++) {
fileLocation = fileArray[i].location;
console.log('filenm', fileLocation);
images.push(fileLocation)
}
// Save the file name into database
return res.status(200).json({
status: 'ok',
filesArray: fileArray,
locationArray: images
});
}
}
})
};
accessKeyId:'xxxxxxxxx',
secretAccessKey:'xxxxxxxxx'
});
const uploadS3=multer({
储存:multerS3({
s3:s3,
acl:“公共读取”,
桶:“xxxxxxxx”,
元数据:(请求、文件、回调)=>{
回调(null,{fieldName:file.fieldName})
},
键:(请求、文件、回调)=>{
var fullPath='products/'+file.originalname;//如果要保存到文件夹中,请将文件夹的名称连接到路径
回调(空,完整路径)
}
}),
限制:{fileSize:2000000},//字节数:2000000字节=2 MB
fileFilter:函数(请求、文件、cb){
检查文件类型(文件,cb);
}
}).阵列(“照片”,10);
exports.uploadProductsImages=异步(请求、回复)=>{
上传3(请求、回复,(错误)=>{
console.log('files',req.files);
如果(错误){
console.log('errors',error);
res.status(500).json({
状态:“失败”,
错误:错误
});
}否则{
//如果找不到文件
如果(请求文件===未定义){
log('uploadProductsImages错误:未选择任何文件!');
res.status(500).json({
状态:“失败”,
消息:“错误:未选择任何文件”
});
}否则{
//如果成功
让fileArray=req.files,
文件位置;
常量图像=[];
for(设i=0;i
const s3 = new AWS.S3({
accessKeyId: 'xxxxxxxxx',
secretAccessKey: 'xxxxxxxxx'
});
const uploadS3 = multer({
storage: multerS3({
s3: s3,
acl: 'public-read',
bucket: 'xxxxxxxx',
metadata: (req, file, callBack) => {
callBack(null, { fieldName: file.fieldname })
},
key: (req, file, callBack) => {
var fullPath = 'products/' + file.originalname;//If you want to save into a folder concat de name of the folder to the path
callBack(null, fullPath)
}
}),
limits: { fileSize: 2000000 }, // In bytes: 2000000 bytes = 2 MB
fileFilter: function (req, file, cb) {
checkFileType(file, cb);
}
}).array('photos', 10);
exports.uploadProductsImages = async (req, res) => {
uploadS3(req, res, (error) => {
console.log('files', req.files);
if (error) {
console.log('errors', error);
res.status(500).json({
status: 'fail',
error: error
});
} else {
// If File not found
if (req.files === undefined) {
console.log('uploadProductsImages Error: No File Selected!');
res.status(500).json({
status: 'fail',
message: 'Error: No File Selected'
});
} else {
// If Success
let fileArray = req.files,
fileLocation;
const images = [];
for (let i = 0; i < fileArray.length; i++) {
fileLocation = fileArray[i].location;
console.log('filenm', fileLocation);
images.push(fileLocation)
}
// Save the file name into database
return res.status(200).json({
status: 'ok',
filesArray: fileArray,
locationArray: images
});
}
}
})
};