如何在 multer-S3 中为 AWS-S3 存储桶指定上传目录?
How to specify upload directory in multer-S3 for AWS-S3 bucket?
我正在使用 express + multer-s3 将文件上传到 AWS S3 服务。
使用以下代码,我能够将文件上传到 S3 Bucket,但直接在存储桶中。
我希望将它们上传到存储桶内的文件夹中。
我找不到这样做的选项。
这是代码
AWS.config.loadFromPath("path-to-credentials.json");
var s3 = new AWS.S3();
var cloudStorage = multerS3({
s3: s3,
bucket: "sample_bucket_name",
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function(request, file, ab_callback) {
ab_callback(null, {fieldname: file.fieldname});
},
key: function(request, file, ab_callback) {
var newFileName = Date.now() + "-" + file.originalname;
ab_callback(null, newFileName);
},
});
var upload = multer({
storage: cloudStorage
});
router.post("/upload", upload.single('myFeildName'), function(request, response) {
var file = request.file;
console.log(request.file);
response.send("aatman is awesome!");
});
S3 并不总是有文件夹(请参阅 http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html)。它将通过在文件名中添加由 / 分隔的字符串来模拟文件夹。
例如
key: function(request, file, ab_callback) {
var newFileName = Date.now() + "-" + file.originalname;
var fullPath = 'firstpart/secondpart/'+ newFileName;
ab_callback(null, fullPath);
},
我对动态目标路径的解决方案。希望这对某人有所帮助!
const fileUpload = function upload(destinationPath) {
return multer({
fileFilter: (req, file, cb) => {
const isValid = !!MIME_TYPE_MAP[file.mimetype];
let error = isValid ? null : new Error("Invalid mime type!");
cb(error, isValid);
},
storage: multerS3({
limits: 500000,
acl: "public-read",
s3,
bucket: YOUR_BUCKET_NAME,
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function (req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function (req, file, cb) {
cb(null, destinationPath + "/" + file.originalname);
},
}),
});
};
module.exports = fileUpload;
如何调用:
router.patch(
"/updateProfilePicture/:userID",
fileUpload("user").single("profileimage"),
usersControllers.updateProfilePicture
);
"profile image" 是正文中传递的文件的键。
"user" 是目标文件夹的路径。您可以传递任何路径,包括文件夹和子文件夹。所以这会将我的文件放在我的存储桶中名为 "user" 的文件夹中。
还有另一种好方法!在你写下你的存储桶名称后,在前面添加一个斜杠的文件夹名称。
const multerS3Config = multerS3({
s3: s3,
bucket: process.env.AWS_BUCKET_NAME + '/<your-folder-name>', //put a slash infront
metadata: function (req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function (req, file, cb) {
cb(null, Date.now() + file.originalname)
}
});
我正在使用 express + multer-s3 将文件上传到 AWS S3 服务。
使用以下代码,我能够将文件上传到 S3 Bucket,但直接在存储桶中。
我希望将它们上传到存储桶内的文件夹中。
我找不到这样做的选项。
这是代码
AWS.config.loadFromPath("path-to-credentials.json");
var s3 = new AWS.S3();
var cloudStorage = multerS3({
s3: s3,
bucket: "sample_bucket_name",
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function(request, file, ab_callback) {
ab_callback(null, {fieldname: file.fieldname});
},
key: function(request, file, ab_callback) {
var newFileName = Date.now() + "-" + file.originalname;
ab_callback(null, newFileName);
},
});
var upload = multer({
storage: cloudStorage
});
router.post("/upload", upload.single('myFeildName'), function(request, response) {
var file = request.file;
console.log(request.file);
response.send("aatman is awesome!");
});
S3 并不总是有文件夹(请参阅 http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html)。它将通过在文件名中添加由 / 分隔的字符串来模拟文件夹。
例如
key: function(request, file, ab_callback) {
var newFileName = Date.now() + "-" + file.originalname;
var fullPath = 'firstpart/secondpart/'+ newFileName;
ab_callback(null, fullPath);
},
我对动态目标路径的解决方案。希望这对某人有所帮助!
const fileUpload = function upload(destinationPath) {
return multer({
fileFilter: (req, file, cb) => {
const isValid = !!MIME_TYPE_MAP[file.mimetype];
let error = isValid ? null : new Error("Invalid mime type!");
cb(error, isValid);
},
storage: multerS3({
limits: 500000,
acl: "public-read",
s3,
bucket: YOUR_BUCKET_NAME,
contentType: multerS3.AUTO_CONTENT_TYPE,
metadata: function (req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function (req, file, cb) {
cb(null, destinationPath + "/" + file.originalname);
},
}),
});
};
module.exports = fileUpload;
如何调用:
router.patch(
"/updateProfilePicture/:userID",
fileUpload("user").single("profileimage"),
usersControllers.updateProfilePicture
);
"profile image" 是正文中传递的文件的键。
"user" 是目标文件夹的路径。您可以传递任何路径,包括文件夹和子文件夹。所以这会将我的文件放在我的存储桶中名为 "user" 的文件夹中。
还有另一种好方法!在你写下你的存储桶名称后,在前面添加一个斜杠的文件夹名称。
const multerS3Config = multerS3({
s3: s3,
bucket: process.env.AWS_BUCKET_NAME + '/<your-folder-name>', //put a slash infront
metadata: function (req, file, cb) {
cb(null, { fieldName: file.fieldname });
},
key: function (req, file, cb) {
cb(null, Date.now() + file.originalname)
}
});