-
-
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); | |
}); | |
} |
@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();
}
Any updates?