generated from corrad-software/corrad-af-2024

Direct-to-storage upload instead of sending to the backend since sending files to the backend from the frontend is forbidden for some reason.
83 lines
2.3 KiB
JavaScript
83 lines
2.3 KiB
JavaScript
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; // ES Modules import
|
|
import { readMultipartFormData } from 'h3';
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
|
|
const parts = [];
|
|
|
|
// Allow headers for specific origins
|
|
// setHeader(event, 'Access-Control-Allow-Origin', 'http://localhost:3000');
|
|
// setHeader(event, 'Access-Control-Allow-Methods', 'POST, OPTIONS');
|
|
// setHeader(event, 'Access-Control-Allow-Headers', 'Content-Type');
|
|
|
|
if (event.method === 'OPTIONS') {
|
|
return new Response(null, { status: 204 });
|
|
}
|
|
|
|
try {
|
|
const parts = await readMultipartFormData(event, { maxSize: 20 * 1024 * 1024});
|
|
|
|
if (!parts) {
|
|
return {
|
|
status: 400,
|
|
message: "Bad request. No parts found."
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error('Failed to read multi-part data:', error);
|
|
return {
|
|
status: 500,
|
|
message: "Failed to read multi-part data"
|
|
}
|
|
}
|
|
|
|
console.log("Hello from the backend!");
|
|
|
|
const S3_Config = {
|
|
region: process.env.NUXT_AWS_REGION,
|
|
credentials: {
|
|
accessKeyId: process.env.NUXT_AWS_ACCESS_KEY_ID,
|
|
secretAccessKey: process.env.NUXT_AWS_SECRET_ACCESS_KEY
|
|
}
|
|
}
|
|
|
|
// Create S3 client with config
|
|
const s3Client = new S3Client(S3_Config);
|
|
|
|
// const { fileName, file } = await readMultipartFormData(event);
|
|
|
|
const fileNamePart = parts.find(p => p.name === "fileName");
|
|
const filePart = parts.find(p => p.name === "file");
|
|
|
|
if (!fileNamePart || !filePart) {
|
|
return {
|
|
status: 400,
|
|
message: "Missing required fields { fileName, file }"
|
|
}
|
|
}
|
|
|
|
const fileName = fileNamePart.data.toString();
|
|
const file = filePart.data;
|
|
|
|
const input = {
|
|
Bucket: process.env.NUXT_AWS_BUCKET,
|
|
Key: fileName,
|
|
Body: file,
|
|
ContentType: filePart.type
|
|
}
|
|
|
|
const command = new PutObjectCommand(input);
|
|
|
|
try {
|
|
const response = await s3Client.send(command);
|
|
console.log(response);
|
|
return response;
|
|
} catch (error) {
|
|
console.error(error);
|
|
return {
|
|
status: 500,
|
|
message: "Failed to upload file to S3",
|
|
error: error
|
|
}
|
|
}
|
|
}) |