web-dev-qa-db-ja.com

AWS-S3バケットのmulter-S3でアップロードディレクトリを指定するにはどうすればよいですか?

Express + multer-s3を使用してAWSS3サービスにファイルをアップロードしています。

次のコードを使用して、ファイルを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!");
});
9
Aatman

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);
},
19
bknights

動的な宛先パスに対する私のソリューション。これが誰かに役立つことを願っています!

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
);

「プロフィール画像」は、本文に渡されるファイルのキーです。
"user"は宛先フォルダへのパスです。フォルダとサブフォルダで構成される任意のパスを渡すことができます。したがって、これにより、ファイルがバケット内の「user」というフォルダーに配置されます。

0
aledap