From 2f749180ee3beb25ce55703629b70f4f9d2090da Mon Sep 17 00:00:00 2001 From: IgorVolochay Date: Tue, 30 Dec 2025 22:02:08 +0300 Subject: [PATCH] Rework s3 upload system --- app/s3_worker.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/app/s3_worker.py b/app/s3_worker.py index 99d10cc..f691b65 100644 --- a/app/s3_worker.py +++ b/app/s3_worker.py @@ -2,6 +2,7 @@ import os import asyncio +from anyio import Condition from dotenv import load_dotenv from aiobotocore.session import get_session @@ -18,6 +19,7 @@ class S3Worker: self._s3_client = None self.bucket = os.getenv('BUCKET_NAME') + self.max_file_size = os.getenv('MAX_FILES_SIZE') async def __aenter__(self): self._client = await self._s3_session.create_client( @@ -40,13 +42,18 @@ class S3Worker: Body=data, ) - async def generate_upload_url(self, key: str, content_type: str, expires_in: int = 300) -> str: - return await self._client.generate_presigned_url("put_object", - Params={ - "Bucket": self.bucket, - "Key": key, - "ContentType": content_type, + async def generate_upload_post(self, key: str, content_type: str, expires_in: int = 300) -> dict: + return await self._client.generate_presigned_post( + Bucket=self.bucket, + Key=key, + Fields={ + "Content-Type": content_type, + "acl": "private", }, + Conditions=[ + ["content-length-range", 0, self.max_file_size], + {"acl": "private"}, + ], ExpiresIn=expires_in, ) @@ -78,7 +85,7 @@ async def test_run(): url = await worker.generate_download_url("test.txt", "hello.txt") print(url) - url = await worker.generate_upload_url("some.jpg", content_type="image/jpeg") + url = await worker.generate_upload_post("some.jpg", content_type="image/jpeg") print(url) url = await worker.generate_download_url("some.jpg", "image.jpg") print(url)