只想上传一个文件到存储桶,但每次上传都会上传两个文件到存储桶

问题描述 投票:0回答:1

每次我从网站将文件上传到我的存储桶时,都会上传两个副本。我的代码有什么问题导致这种情况发生吗?

const multer = require('multer');
const multers3 = require('multer-s3');
const path = require('path');  // Add this for file extension handling
AWS_SDK_LOAD_CONFIG=1

aws.config.update({
  accessKeyId: 'MyAccessKeyId',
  secretAccessKey: 'MySecretKey',
});

const fileFilter = (req, file, cb) => {
  // Allowed ext
  const filetypes = /jpeg|jpg|png|gif/;
  // Check ext
  const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
  // Check mime
  const mimetype = filetypes.test(file.mimetype);

  if (mimetype && extname) {
      return cb(null, true);
  } else {
      cb('Error: Images Only!');
  }
};
const s3 = new aws.S3({});
module.exports = {
  uploadImage: multer({
      storage: multers3({
          s3: s3,
          bucket: 'my-bucket',
          acl: 'public-read',
          metadata: (req, file, cb) => {
              cb(null, { fieldName: file.fieldname });
          },
          key: (req, file, cb) => {
              const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
              cb(null, uniqueSuffix + '-' + file.originalname);
          },
      }),
      limits: { fileSize: 3 * 1024 * 1024 },  // 3 MB
      fileFilter: fileFilter,
  })
};

我尝试更改一些内容,但没有任何效果,multer 和 multer 3 是否都将相同的文件上传到我的存储桶?

node.js amazon-web-services amazon-s3 bucket
1个回答
0
投票

好吧,我发现它与 uniqueSuffix 有关,它为文件上传到存储桶以及从存储桶检索同一文件时创建两个不同的密钥。这在我的存储桶中创建了同一文件的两个不同副本。为了克服这个问题并保持文件的唯一性。我决定使用原始文件名+用户ID+时间戳的密钥,不包括秒,以确保上传和检索之间的时间相同,因此上传和检索文件的密钥是相同的。如果有人感兴趣的话,这是代码。 ```key: (req, file, cb) => { const userId = req.user._id; // 假设用户 ID 在 req.user._id 中可用 const isProfilePictureUpload = req.body.isProfilePictureUpload === 'true';

            if (isProfilePictureUpload) {
                const filename = `profile_${userId}.${file.originalname.split('.').pop()}`;
                cb(null, filename);
            } else {
                // Use the original filename, user ID, and timestamp with days, hours, and minutes
                const now = new Date();
                const days = now.getDate();
                const hours = now.getHours();
                const minutes = now.getMinutes();
        
                const timestamp = `${days}-${hours}-${minutes}`;
                const filename = `${file.originalname}-${userId}-${timestamp}`;
                cb(null, filename);
            }
        }, ```
© www.soinside.com 2019 - 2024. All rights reserved.