Add presigned URL support for direct S3 downloads (#48)
This commit is contained in:
@@ -450,6 +450,46 @@ class S3Storage:
|
||||
except ClientError:
|
||||
return False
|
||||
|
||||
def generate_presigned_url(
|
||||
self,
|
||||
s3_key: str,
|
||||
expiry: Optional[int] = None,
|
||||
response_content_type: Optional[str] = None,
|
||||
response_content_disposition: Optional[str] = None,
|
||||
) -> str:
|
||||
"""
|
||||
Generate a presigned URL for downloading an object.
|
||||
|
||||
Args:
|
||||
s3_key: The S3 key of the object
|
||||
expiry: URL expiry in seconds (defaults to settings.presigned_url_expiry)
|
||||
response_content_type: Override Content-Type header in response
|
||||
response_content_disposition: Override Content-Disposition header in response
|
||||
|
||||
Returns:
|
||||
Presigned URL string
|
||||
"""
|
||||
if expiry is None:
|
||||
expiry = settings.presigned_url_expiry
|
||||
|
||||
params = {
|
||||
"Bucket": self.bucket,
|
||||
"Key": s3_key,
|
||||
}
|
||||
|
||||
# Add response header overrides if specified
|
||||
if response_content_type:
|
||||
params["ResponseContentType"] = response_content_type
|
||||
if response_content_disposition:
|
||||
params["ResponseContentDisposition"] = response_content_disposition
|
||||
|
||||
url = self.client.generate_presigned_url(
|
||||
"get_object",
|
||||
Params=params,
|
||||
ExpiresIn=expiry,
|
||||
)
|
||||
return url
|
||||
|
||||
|
||||
# Singleton instance
|
||||
_storage = None
|
||||
|
||||
Reference in New Issue
Block a user