Добавил новый подход к загрузке файла через S3

This commit is contained in:
Viner Abubakirov
2026-02-23 21:29:19 +05:00
parent c803e54313
commit fb15679fb8
2 changed files with 40 additions and 3 deletions

View File

@@ -1,5 +1,4 @@
from app.utils.uploader import S3ChunkUploadBackend # Используется для подключения S3
# from app.utils.uploader import DiskChunkUploadBackend
from app.utils.uploader import HybridDiskS3UploadBackend
uploader_backend = S3ChunkUploadBackend()
uploader_backend = HybridDiskS3UploadBackend()

View File

@@ -119,3 +119,41 @@ class S3ChunkUploadBackend(ChunkUploadBackend):
)
self.part_number = 1
self.parts = []
class HybridDiskS3UploadBackend(ChunkUploadBackend):
def __init__(self, key_prefix: str = ""):
self.s3 = boto3.client(
service_name="s3",
aws_access_key_id=settings.S3_ACCESS_KEY,
aws_secret_access_key=settings.S3_SECRET_KEY,
endpoint_url=settings.S3_ENDPOINT_URL,
region_name=settings.S3_REGION_NAME,
use_ssl=True,
config=Config(signature_version=settings.S3_SIGNATURE_VERSION),
)
self.bucket = settings.S3_BUCKET_NAME
self.key_prefix = key_prefix
self.filename = None
self.disk_backend = DiskChunkUploadBackend()
def start(self, filename):
self.filename = filename
return self.disk_backend.start(filename)
def upload_chunk(self, chunk):
return self.disk_backend.upload_chunk(chunk)
def abort(self):
self.filename = None
return self.disk_backend.abort()
def finish(self):
if filepath := self.disk_backend.finish():
response = self.s3.upload_file(
Filename=filepath,
Bucket=settings.S3_BUCKET_NAME,
Key=f"{self.key_prefix}{self.filename}",
)
os.remove(filepath)
return response["Location"]