6

I wish to post file to multipart form and upload it to Amazon S3 Bucket and return to user link to the file.

const express = require('express'),
    aws = require('aws-sdk'),
    bodyParser = require('body-parser'),
    multer = require('multer'),
    multerS3 = require('multer-s3');

aws.config.update({
    secretAccessKey: 'secret',
    accessKeyId: 'secret',
    region: 'us-east-2'
});

const app = express(),
    s3 = new aws.S3();

app.use(bodyParser.json());

const upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: 'some-name',
        key: (req, file, cb) => {
            console.log(file);
            cb(null, file.originalname); //use Date.now() for unique file keys
        }
    })
});

app.post('/upload', upload.array('file',1), (req, res, next) => {
    res.send("How to return File URL?");
});

app.listen(3000);

How can I have the direct URL to the file?

John Rotenstein
  • 165,783
  • 13
  • 223
  • 298
0x77dev
  • 154
  • 1
  • 10

3 Answers3

8

(Multer NPM) has already written there in documentation:

.single(fieldname)     => (req.file)

Accept a single file with the name fieldname. The single file will be stored in req.file.

app.post('/upload', upload.single('file'), (req, res, next) => {
    console.log('Uploaded!');
    res.send(req.file);
});

.array(fieldname[, maxCount])     => (req.files)

Accept an array of files, all with the name fieldname. Optionally error out if more than maxCount files are uploaded. The array of files will be stored in req.files.

app.post('/upload', upload.array('file', 1), (req, res, next) => {
    console.log('Uploaded!');
    res.send(req.files);
});

.fields(fields)     => (req.files)

Accept a mix of files, specified by fields. An object with arrays of files will be stored in req.files

app.post('/upload', upload.fields([
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 8 }
]), (req, res, next) => {
    console.log('Uploaded!');
    res.send(req.files);
});

.any()     => (req.files)

Accepts all files that comes over the wire. An array of files will be stored in req.files.

.none()

Accept only text fields. If any file upload is made, error with code "LIMIT_UNEXPECTED_FILE" will be issued.

turivishal
  • 21,335
  • 6
  • 16
  • 44
  • Is there any way to get uploaded object url in return? – Deepak Aug 11 '20 at 13:05
  • @Deepak BTW this is the answer of your question, you will get inside file object `file.location`. – turivishal Aug 11 '20 at 13:14
  • @Turivishal- This is how I was implementing. See my question for the same https://stackoverflow.com/questions/63358933/how-to-get-s3-bucket-uploaded-object-url-using-multer – Deepak Aug 11 '20 at 13:15
1

U could get it from the location property of the file.

res.send(req.file.location);
gkrthk
  • 303
  • 1
  • 7
0

Just use

req.file.location

in the Success Response