-
-
Save keithweaver/575a61aab19711bbeb98c10785be4674 to your computer and use it in GitHub Desktop.
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); | |
}); | |
} |
This is a headers issue or busboy issue. I used the code above and it worked fine (https://www.youtube.com/watch?v=Sd9kAqs1avA). Other videos:
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' }
I'm able to use this and send a post request with Postman without any issue. I cannot seem to get a simple file upload form to work with it, though. I'm using react and axios. Do you have an example of any front end code that would work with this?
This definitely doesn't work. The request never completes after the first busboy.on(). This gist only got me running in circles and wasting time.
I would highly recommend using something like https://www.npmjs.com/package/s3fs or https://www.npmjs.com/package/multer-s3.
This works just great. Request never completes cause there is no response in the code. Just console.log.
I am getting the error on this line: const file = req.files.element2; as Property files does not exists on request
as ashok-sc said the request never completes after the first busboy.on and therefor after two seconds (the default timeout) one more request automatically is generated and i end up having two (same) files with different timestamps in my s3 bucket... what am i supposed to do ???
Use of multer is highly advised it's better
var file = req.files.element2;
TypeError: Cannot read property 'element2' of undefined
above error getting when i'm trying to use code...
Simply you can "express-fileupload" package to your code
In this way :---------------
const fileUpload = require('express-fileupload');
app.use(fileUpload());
This works for me. Good luck :-)
I got the following error @keithweaver
Error: params.Body is required
Any idea what this might be? It says that file.data is undefinedAnd 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?
@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);
});
});
}
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 ?
Encountered the same issue from Multer.
My simple workaround is:
import * as fs from "fs";
async uploadFile(file: Express.Multer.File, bucket: string, key: string): Promise<void> {
const filePath = join(__dirname, "..", file.path);
const params = {
Bucket: bucket,
Key: key,
Body: fs.createReadStream(filePath),
ContentType: file.mimetype
};
await this.s3.upload(params).promise();
}
var file = req.files.element2;
TypeError: Cannot read property 'element2' of undefined
above error getting when i'm trying to use code...