You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.6 KiB

const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3');
const cors = require('cors');
const crypto = require('crypto');
const express = require('express');
const fs = require('fs');
const multer = require('multer');
const path = require('path');
require('dotenv').config()
const app = express();
app.use(cors());
const port = 3000;
// Configure AWS
const s3Client = new S3Client({
region: process.env.AWS_REGION,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY,
secretAccessKey: process.env.AWS_SECRET_KEY
}
});
const upload = multer({ dest: 'uploads/' });
// POST endpoint to upload an image
app.post('/image', upload.single('image'), (req, res) => {
const file = req.file;
// Read the file from the temporary location
fs.readFile(file.path, async (err, data) => {
if (err) throw err; // Handle error
const hashSum = crypto.createHash('sha256');
hashSum.update(data);
const hashHex = hashSum.digest('hex');
const bucketName = 'gifts-image';
console.log(file.originalname, '=>', file.path, '=>', hashHex);
const fileName = hashHex;
const params = {
Body: data,
Bucket: bucketName, // S3 Bucket name
ContentType: file.mimetype, // File content type
Key: fileName, // File name to use in S3
};
// Upload the file to S3
try {
const command = new PutObjectCommand(params);
const response = await s3Client.send(command);
if (response.$metadata.httpStatusCode !== 200) {
const errorTime = new Date().toISOString();
console.log(errorTime, "Error uploading to S3 with bad HTTP status. Metadata:", response.$metadata);
res.status(500).send(JSON.stringify({ success: false, message: "Got bad status of " + response.$metadata.httpStatusCode + " from AWS. See server logs at " + errorTime }));
} else {
const finalUrl = `https://${bucketName}.s3.amazonaws.com/${fileName}`;
fs.rm(file.path, (err) => {
if (err) {
console.error("Error deleting temp file", file.path, "with error:", err);
}
});
res.send(JSON.stringify({ success: true, url: finalUrl }));
}
} catch (uploadError) {
const errorTime = new Date().toISOString();
console.error(errorTime, "Error uploading to S3:", uploadError);
res.status(500).send(JSON.stringify({ success: false, message: "Got error uploading file. See server logs at " + errorTime + " Error Details: " + JSON.stringify(uploadError) }));
}
});
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});