Spaces:
Build error
Build error
| import os | |
| import boto3 | |
| import botocore | |
| import logging | |
| import json | |
| from dotenv import load_dotenv | |
| from models.response import Response | |
| load_dotenv() | |
| class S3: | |
| def __init__(self, custom_logging=None) -> None: | |
| self.logging = custom_logging if custom_logging is not None else logging | |
| self.aws_access_key_id = os.getenv('AWS_ACCESS_KEY_ID', '') | |
| self.aws_secret_access_key = os.getenv('AWS_SECRET_ACCESS_KEY', '') | |
| self.aws_default_region = os.getenv('AWS_DEFAULT_REGION', '') | |
| self.client = boto3.client( | |
| service_name='s3', | |
| region_name=self.aws_default_region, | |
| aws_access_key_id=self.aws_access_key_id, | |
| aws_secret_access_key=self.aws_secret_access_key | |
| ) | |
| # Function to list images in a specific S3 bucket | |
| def list_images_in_bucket(self, bucket_name): | |
| response = self.client.list_objects_v2(Bucket=bucket_name) | |
| return [obj['Key'] for obj in response.get('Contents', []) if obj['Key'].lower().endswith(('.png', '.jpg', '.jpeg'))] | |
| # Function to get image URLs | |
| def get_image_urls(self, bucket_name, image_keys): | |
| return [self.client.generate_presigned_url('get_object', Params={'Bucket': bucket_name, 'Key': key}) for key in image_keys] | |
| # Function to upload file to S3 | |
| def upload_file(self, bucket_name, file, name, metadata:dict): | |
| res = Response() | |
| try: | |
| # self.client.upload_fileobj( | |
| # Fileobj=file, | |
| # Bucket=bucket_name, | |
| # Key=name, | |
| # ExtraArgs={ | |
| # 'Metadata': { | |
| # 'x-request-id': req_id, | |
| # } | |
| # }) | |
| metadata = {k: str(v) for k, v in metadata.items()} | |
| self.client.put_object( | |
| Body=file, | |
| Bucket=bucket_name, | |
| Key=name, | |
| Metadata=metadata | |
| ) | |
| res.status = 200 | |
| except botocore.exceptions.ClientError as error: | |
| res.status = 429 | |
| if error.response['Error']['Code'] == 'LimitExceededException': | |
| res.error = ValueError('API call limit exceeded; backing off and retrying...') | |
| else: | |
| res.error = error | |
| except botocore.exceptions.ParamValidationError as error: | |
| res.status = 400 | |
| res.error = ValueError('The parameters you provided are incorrect: {}'.format(error)) | |
| return res | |
| # Function to delete a file from S3 | |
| def delete_image(self, bucket_name, file_key): | |
| if isinstance(file_key, list): | |
| for k in file_key: | |
| print(f'Removing "{k}"...') | |
| self.client.delete_object(Bucket=bucket_name, Key=k) | |
| else: | |
| self.client.delete_object(Bucket=bucket_name, Key=file_key) | |
| # Function to list images in a specific S3 bucket | |
| def list_files_in_bucket(self, bucket_name): | |
| response = self.client.list_objects_v2(Bucket=bucket_name) | |
| return [obj['Key'] for obj in response.get('Contents', [])] | |
| # Function to get image URLs | |
| def get_files_urls(self, bucket_name, file_keys): | |
| return [self.client.generate_presigned_url('get_object', Params={'Bucket': bucket_name, 'Key': key}) for key in file_keys] | |