如何使用 multer 动态指定要上传到我的 s3 存储桶中的文件路径

How do I dynamically specify a file path I would like to upload to in my s3 bucket using multer

所以,我对 Nodejs 很陌生,我正在尝试实现 API 以将文件上传到 s3 存储桶。但是,我想指定将每个文件上传到的文件路径作为可选参数。实现这一目标的最简单方法是什么?这是上传文件的原始代码

require("dotenv/config");
const express = require("express");
const multer = require("multer")
const AWS = require("aws-sdk")

const app = express();
const port = process.env.PORT || 3000;

const s3 = new AWS.S3({
    accessKeyId: process.env.AWS_ID,
    secretAccessKey: process.env.AWS_SECRET,
    region: process.env.AWS_REGION
})

const storage = multer.memoryStorage({
    destination: (req, file, callback) => {
        callback(null, "")
    }
})

const upload = multer({storage}).single("file");

app.post("/upload", upload, (req, res) => {
    let myFile = req.file.originalname

    const params = {
        Bucket: process.env.AWS_BUCKET_NAME,
        Key: myFile,
        Body: req.file.buffer,
        
    }

    s3.upload(params, (error, data) => {
        if(error) {
            res.status(500).send(error)        
        }

        res.status(200).send(data)

    })
});


app.listen(port, () => {
    console.log(`Server is up at ${port}`)
});


如果您尝试将文件上传到文件夹,AWS s3 会通过添加前缀来模拟此操作。您可以通过添加文件夹名称来更改Key参数。

app.post("/upload/:directory", upload, (req, res) => {
    let myFile = req.file.originalname
    let path = req.params.directory

    const params = {
        Bucket: process.env.AWS_BUCKET_NAME,
        Key: `${path}/${myFile}`,
        Body: req.file.buffer,
        
    }

    s3.upload(params, (error, data) => {
        if(error) {
            res.status(500).send(error)        
        }

        res.status(200).send(data)

    })
});