1

My current implementation for letting a user upload a file to s3 through my server looks like this.

import express from 'express';
import "dotenv/config";
import { S3Client } from '@aws-sdk/client-s3';
import multer from 'multer';
import multerS3 from 'multer-s3';

const router = express.Router();

const s3 = new S3Client({
    secretAccessKey: process.env.SECRET_KEY,
    accessKeyId: process.env.ACCESS_KEY,
    region: process.env.REGION
});

const upload = multer({
    storage: multerS3({
      s3: s3,
      bucket: process.env.BUCKET,
      metadata: function (req, file, cb) {
        cb(null, {fieldName: file.fieldname});
      },
      key: function (req, file, cb) {
        cb(null, `${req.user.id}/${Date.now()}-${file.originalname}`)
      }
    })
});

router.post('/upload', upload.single('file'), function(req, res, next) {
    res.send({
        message: "Uploaded!",
        urls: { name: `${req.user.id}/${Date.now()}-${req.file.originalname}`, type: req.file.mimetype, size: req.file.size }
    });
});

export default router;

I am trying to stream the progress of the upload back to the user, but I could not find any method in multer or multer-s3 that would allow me to do this. My server is written using express. Am I missing something fundamental?

Paul Jose
  • 23
  • 5
  • AFAIK multer doesn't provide a similar event, Something as `multer.on('data', size => {console.log(size)}` would be very useful – pierpy Apr 15 '23 at 16:35
  • However, there are some workarounds, [here](https://stackoverflow.com/q/35288625/7353417) – pierpy Apr 15 '23 at 16:43
  • @pierpy Could you point me in the right direction please? – Paul Jose Apr 15 '23 at 21:47
  • This solution seems relatively simple to implement: [middleware](https://stackoverflow.com/a/67456511/7353417) – pierpy Apr 15 '23 at 21:57

0 Answers0