Как переименовать файл с помощью multer перед его загрузкой в ​​корзину s3? - PullRequest
1 голос
/ 07 июня 2019

Я хочу переименовать каждый файл перед его загрузкой в ​​корзину aws s3, используя multer, node.js и express.js

Вот так выглядит моя текущая реализация

Конец шрифта

const file = e.target.files[0];
const formData = new FormData();
formData.append('file', file);
const { data } = await axios.post('api/aws/upload-image', formData);

Backend

var storage = multer.memoryStorage();
const upload = multer({ storage }).single('file');

const s3Client = new aws.S3({
    accessKeyId: config.aws.accessKey,
    secretAccessKey: config.aws.secretKey,
    region: config.aws.region
});


router.post('/upload-image', async (req, res) => {
    upload(req, res, function(err) {
        if (err instanceof multer.MulterError || err)
            return res.status(500).json(err);

        const uploadParams = {
            Bucket: config.aws.bucket,
            Key: req.file.originalname,
            ACL: 'public-read',
            Body: req.file.buffer
        };

        s3Client.upload(uploadParams, (err, data) => {
            if (err) res.status(500).json({ error: 'Error -> ' + err });

            return res.status(200).send(data.Location);
        });
    });
});

Код выше работает как надо. Но я пытаюсь переименовать файл, прежде чем он будет загружен.

Я думал об этом:

var storage = multer.diskStorage({
    filename: function (req, file, cb) {
      cb(null, Date.now() + '-' +file.originalname )
    }
})

Но это возвращает элемент файла, а не элемент blob, и поэтому не загружается в корзину s3.

Как я могу сделать так, чтобы при отправке файла на node.js я сначала менял имя файла, а затем загружал файл?

1 Ответ

0 голосов
/ 07 июня 2019

В методе upload используется PutObjectRequest, конструктор PutObjectRequest, ключевым параметром на самом деле является имя загруженного файла.

Просто измените значение Key на новое имя.

const uploadParams = {
  Bucket: config.aws.bucket,
  Key:  "NEW_NAME_WHAT_YOU_WANT", // req.file.originalname,
  ACL: 'public-read',
  Body: req.file.buffer
};
...