const {s3} = require("aws-sdk");
const {s3client, PutObjectCommand} = require("@aws-sdk/client-s3")
const uuid = require("uuid").v4;
exports.s3UploadV2 = async(files) => {
const s3 = new s3();
const params = files.map(file => {
return {
Bucket: process.env.AWS_BUCKET_NAME,
Key: `uploads/${uuid()}-${files.originalname}`,
Body: files.buffer
}
})
return await Promise.all(
params.map(param => s3.upload(param).promise())
);
}
exports. s3UploadV3 = async (files) => {
const s3client = new s3client();
const param = {
Bucket: process.env.AWS_BUCKET_NAME,
Key: `uploads/${uuid()}-${files.originalname}`,
Body: files.buffer
}
return await Promise.all(
params.map(param => s3client.send(new PutObjectCommand(param)))
)
}
require("dotenv").config();
const express = require("express");
const multer = require("multer");
const {s3UploadV2, s3UploadV3} = require("./s3Service");
const uuid = require("uuid").v4;
const app = express();
const storage = multer.memoryStorage({
destination: (req, file, cb) => {
cb(null, "uploads");
},
filename: (req, file, cb) => {
const {originalname} = file;
cb(null, `${uuid()}-${originalname}`);
}
});
const fileFilter = (req, file, cb) => {
if(file.mimetype.split("/")[0] === 'image/jpeg') {
cb(null, true)
} else {
cb(new Error("file is not of the correct type."), false);
}
};
const upload = multer({
storage,
fileFilter,
limits: {fileSize: 1000000, files: 2}
});
app.post("/upload", upload.array("file"), async (req, res) => {
try {
const results = await s3UploadV3(req.files);
res.status(200).json({success: true, results});
} catch (error) {
console.log(error)
}
})
app.use((error, req, res, next)=>{
if (error instanceof multer.MulterError) {
if(error.code==="LIMIT_FILE_SIZE") {
return res.json({message: "file limit reached."});
}
if(error.code === "LIMIT_FILE_COUNT"){
return res.json({message: "file is too large."});
}
if(error.code === "LIMIT_UNEXPECTED_FILE"){
return res.json({message: "file must be an image."});
}
}
})
app.listen(4000, () => console.log("listening on port 4000"));