diff --git a/apps/api/plane/app/views/asset/v2.py b/apps/api/plane/app/views/asset/v2.py index 5994ffd8c..7e0c14fdd 100644 --- a/apps/api/plane/app/views/asset/v2.py +++ b/apps/api/plane/app/views/asset/v2.py @@ -740,7 +740,8 @@ class WorkspaceAssetDownloadEndpoint(BaseAPIView): storage = S3Storage(request=request) signed_url = storage.generate_presigned_url( object_name=asset.asset.name, - disposition=f"attachment; filename={asset.asset.name}", + disposition="attachment", + filename=asset.attributes.get("name", uuid.uuid4().hex), ) return HttpResponseRedirect(signed_url) @@ -767,7 +768,8 @@ class ProjectAssetDownloadEndpoint(BaseAPIView): storage = S3Storage(request=request) signed_url = storage.generate_presigned_url( object_name=asset.asset.name, - disposition=f"attachment; filename={asset.asset.name}", + disposition="attachment", + filename=asset.attributes.get("name", uuid.uuid4().hex), ) return HttpResponseRedirect(signed_url) diff --git a/apps/api/plane/settings/storage.py b/apps/api/plane/settings/storage.py index f2be261ad..71709ebe0 100644 --- a/apps/api/plane/settings/storage.py +++ b/apps/api/plane/settings/storage.py @@ -1,5 +1,6 @@ # Python imports import os +import uuid # Third party imports import boto3 @@ -101,6 +102,9 @@ class S3Storage(S3Boto3Storage): def _get_content_disposition(self, disposition, filename=None): """Helper method to generate Content-Disposition header value""" + if filename is None: + filename = uuid.uuid4().hex + if filename: # Encode the filename to handle special characters encoded_filename = quote(filename)