From beb259b4d80e71feb70b0fe61f492688834d6081 Mon Sep 17 00:00:00 2001 From: marcsello Date: Sat, 28 Nov 2020 20:52:46 +0100 Subject: [PATCH] Added filename setting for the caff endpoint --- src/views/contentview.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/views/contentview.py b/src/views/contentview.py index a17b8fb..1a2e556 100644 --- a/src/views/contentview.py +++ b/src/views/contentview.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import string from flask import abort, Response, current_app from flask_classful import FlaskView from flask_security import login_required, current_user @@ -14,18 +15,22 @@ class ContentView(FlaskView): This is just a simple content proxy with access control """ - def _stream_from_minio(self, bucket: str, filename: str): + def _stream_from_minio(self, bucket: str, id_: int, filename: str = None): try: - data = storage.connection.get_object(bucket, filename) + data = storage.connection.get_object(bucket, str(id_)) except NoSuchKey: abort(404) - return Response(data.stream(), mimetype=data.headers['Content-type']) + headers = {} + if filename: + headers['Content-Disposition'] = f'attachment; filename="{filename}"' + + return Response(data.stream(), mimetype=data.headers['Content-type'], headers=headers) def preview(self, id_: int): i = Item.query.get_or_404(id_) - return self._stream_from_minio(current_app.config['MINIO_PREVIEW_BUCKET_NAME'], str(i.id)) + return self._stream_from_minio(current_app.config['MINIO_PREVIEW_BUCKET_NAME'], i.id) @login_required def caff(self, id_: int): @@ -34,4 +39,11 @@ class ContentView(FlaskView): if not p: abort(403) - return self._stream_from_minio(current_app.config['MINIO_CAFF_BUCKET_NAME'], str(p.item.id)) + filename = ''.join(filter(lambda x: x in string.ascii_lowercase, p.item.name)) + + if not filename: + filename = str(p.item.id) + + filename += f'_{p.id}.caff' + + return self._stream_from_minio(current_app.config['MINIO_CAFF_BUCKET_NAME'], p.item.id, filename)