Last active
August 21, 2023 19:30
-
-
Save keithweaver/575a61aab19711bbeb98c10785be4674 to your computer and use it in GitHub Desktop.
S3 File Upload to AWS S3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const AWS = require('aws-sdk'); | |
const Busboy = require('busboy'); | |
const BUCKET_NAME = ''; | |
const IAM_USER_KEY = ''; | |
const IAM_USER_SECRET = ''; | |
function uploadToS3(file) { | |
let s3bucket = new AWS.S3({ | |
accessKeyId: IAM_USER_KEY, | |
secretAccessKey: IAM_USER_SECRET, | |
Bucket: BUCKET_NAME | |
}); | |
s3bucket.createBucket(function () { | |
var params = { | |
Bucket: BUCKET_NAME, | |
Key: file.name, | |
Body: file.data | |
}; | |
s3bucket.upload(params, function (err, data) { | |
if (err) { | |
console.log('error in callback'); | |
console.log(err); | |
} | |
console.log('success'); | |
console.log(data); | |
}); | |
}); | |
} | |
module.exports = (app) => { | |
// The following is an example of making file upload with additional body | |
// parameters. | |
// To make a call with PostMan | |
// Don't put any headers (content-type) | |
// Under body: | |
// check form-data | |
// Put the body with "element1": "test", "element2": image file | |
app.post('/api/upload', function (req, res, next) { | |
// This grabs the additional parameters so in this case passing in | |
// "element1" with a value. | |
const element1 = req.body.element1; | |
var busboy = new Busboy({ headers: req.headers }); | |
// The file upload has completed | |
busboy.on('finish', function() { | |
console.log('Upload finished'); | |
// Your files are stored in req.files. In this case, | |
// you only have one and it's req.files.element2: | |
// This returns: | |
// { | |
// element2: { | |
// data: ...contents of the file..., | |
// name: 'Example.jpg', | |
// encoding: '7bit', | |
// mimetype: 'image/png', | |
// truncated: false, | |
// size: 959480 | |
// } | |
// } | |
// Grabs your file object from the request. | |
const file = req.files.element2; | |
console.log(file); | |
// Begins the upload to the AWS S3 | |
uploadToS3(file); | |
}); | |
req.pipe(busboy); | |
}); | |
} |
I got the following error @keithweaver
Error: params.Body is required
Any idea what this might be? It says that file.data is undefined
And here's what I got when I log the file
{ fieldName: 'file', originalFilename: 'aaaaaaaaaa.png', path: '/var/folders/tb/jt5f67f91x7d60vzm14fnqv40000gn/T/XARw2C-5embUMiEefpiqv8oq.png', headers: { 'content-disposition': 'form-data; name="file"; filename="aaaaaaaaaa.png"', 'content-type': 'image/png' }, size: 102806, name: 'aaaaaaaaaa.png', type: 'image/png' }
Any updates?
i am struggling with same error Error: params.Body is required` did you the answer ?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@menthos I Resolved that issues :
npm install express-fileupload
const fileUpload = require('express-fileupload');
app.use(fileUpload());
........................................................
exports.uploadToS3 = function (file) {
var file = file.files; // This line need to write...............................................
let s3bucket = new AWS.S3({
accessKeyId: '',
secretAccessKey: '',
Bucket: '',
});
s3bucket.createBucket(function () {
var params = {
Bucket: '',
Key: file.name,
Body: file.data,
};
s3bucket.upload(params, function (err, data) {
if (err) {
console.log('error in callback');
console.log(err);
}
console.log('success');
console.log(data);
});
});
}