How to get direct URL to multipart file uploaded via Node.js
Asked Answered
S

3

8

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?

Severe answered 26/11, 2019 at 15:35 Comment(0)
V
9

(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.

Vashti answered 8/6, 2020 at 8:36 Comment(0)
P
2

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

res.send(req.file.location);
Pacifically answered 26/11, 2019 at 17:23 Comment(1)
Not getting full url this way, it returns undefined.Vashti
H
0

Just use

req.file.location

in the Success Response

Humph answered 3/5, 2021 at 17:22 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.