import { createPresignedPost } from '@aws-sdk/s3-presigned-post'; import { S3Client } from '@aws-sdk/client-s3'; import { fromEnv } from '@aws-sdk/credential-providers'; const FILE_SIZE_LIMIT = 20971520; // 20MB const s3Client = new S3Client({ region: process.env.AWS_REGION, credentials: fromEnv(), }); export const getPresignedUrl = async (fileName: string, fileType: string) => { return createPresignedPost(s3Client, { Bucket: process.env.AWS_BUCKET_NAME ?? 'vision-agent-dev', Key: fileName, Conditions: [ ['content-length-range', 0, FILE_SIZE_LIMIT], ['starts-with', '$Content-Type', fileType], ], Fields: { acl: 'public-read', 'Content-Type': fileType, }, Expires: 600, }); }; export const upload = async ( base64: string, fileName: string, fileType: string, ) => { const { url, fields } = await getPresignedUrl(fileName, fileType); const formData = new FormData(); Object.entries(fields).forEach(([key, value]) => { formData.append(key, value as string); }); const res = await fetch(base64); const blob = await res.blob(); formData.append('file', blob); return fetch(url, { method: 'POST', body: formData, }); };