Files
AWS/mini-dropbox/CODE/app/s3.py
2026-03-20 12:01:02 +05:30

124 lines
2.9 KiB
Python

# === FILE: app/s3.py ===
import boto3
from botocore.exceptions import ClientError
from app.config import Config
def get_s3_client():
"""Create and return an S3 client using IAM role credentials."""
return boto3.client('s3', region_name=Config.AWS_REGION)
def upload_file(file_obj, s3_key, content_type):
"""
Upload a file to S3.
Args:
file_obj: File object to upload
s3_key: S3 key (path) for the file
content_type: MIME type of the file
Returns:
True if successful, raises exception otherwise
"""
try:
s3_client = get_s3_client()
s3_client.upload_fileobj(
file_obj,
Config.S3_BUCKET_NAME,
s3_key,
ExtraArgs={
'ContentType': content_type
}
)
return True
except ClientError as e:
print(f"Error uploading file to S3: {e}")
raise
def delete_file(s3_key):
"""
Delete a file from S3.
Args:
s3_key: S3 key (path) of the file to delete
Returns:
True if successful, False otherwise
"""
try:
s3_client = get_s3_client()
s3_client.delete_object(
Bucket=Config.S3_BUCKET_NAME,
Key=s3_key
)
return True
except ClientError as e:
print(f"Error deleting file from S3: {e}")
return False
def generate_presigned_url(s3_key, expiry=900):
"""
Generate a presigned URL for downloading a file.
Args:
s3_key: S3 key (path) of the file
expiry: Expiration time in seconds (default 15 minutes)
Returns:
Presigned URL string
"""
try:
s3_client = get_s3_client()
url = s3_client.generate_presigned_url(
'get_object',
Params={
'Bucket': Config.S3_BUCKET_NAME,
'Key': s3_key
},
ExpiresIn=expiry
)
return url
except ClientError as e:
print(f"Error generating presigned URL: {e}")
raise
def generate_share_url(s3_key, expiry=604800):
"""
Generate a presigned URL for sharing a file (valid for 7 days).
Args:
s3_key: S3 key (path) of the file
expiry: Expiration time in seconds (default 7 days)
Returns:
Presigned URL string
"""
return generate_presigned_url(s3_key, expiry)
def get_cloudfront_url(s3_key):
"""
Generate a CloudFront URL for a file (for preview purposes).
Args:
s3_key: S3 key (path) of the file
Returns:
CloudFront URL string
"""
if Config.CLOUDFRONT_DOMAIN:
return f"https://{Config.CLOUDFRONT_DOMAIN}/{s3_key}"
else:
# Fallback to S3 URL if CloudFront is not configured
return f"https://{Config.S3_BUCKET_NAME}.s3.{Config.AWS_REGION}.amazonaws.com/{s3_key}"