From 1e4f78885e1b6626d1b3e512b09575d6c525058e Mon Sep 17 00:00:00 2001 From: chee Date: Tue, 17 Nov 2020 12:32:53 +0000 Subject: [PATCH] upload files to a bucket --- app/config.py | 8 +++++--- app/file.py | 27 +++++++++++++++++++++------ app/routes.py | 2 +- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/config.py b/app/config.py index 16d60bc..6f21334 100644 --- a/app/config.py +++ b/app/config.py @@ -5,6 +5,8 @@ class Config(object): - SECRET_KEY = os.environ.get('CC0_SECRET_KEY') - SQLALCHEMY_DATABASE_URI = os.environ.get("CC0_SQLALCHEMY_DATABASE_URI") or f"sqlite:///{os.path.join(basedir, 'app.db')}" - SQLALCHEMY_TRACK_MODIFICATIONS = False + SECRET_KEY = os.environ.get('CC0_SECRET_KEY') + SQLALCHEMY_DATABASE_URI = os.environ.get("CC0_SQLALCHEMY_DATABASE_URI") or f"sqlite:///{os.path.join(basedir, 'app.db')}" + SQLALCHEMY_TRACK_MODIFICATIONS = False + OBJECT_KEY_ID = os.environ.get('CC0_OBJECT_KEY_ID') + OBJECT_ACCESS_KEY = os.environ.get('CC0_OBJECT_ACCESS_KEY') diff --git a/app/file.py b/app/file.py index db4c899..fa62580 100644 --- a/app/file.py +++ b/app/file.py @@ -1,15 +1,30 @@ import mimetypes -from os.path import join, basename, dirname +from os.path import basename +from .config import Config from werkzeug.utils import secure_filename -from slugify import slugify mimetypes.init() +import boto3 + +storage_endpoint = "https://eu-central-1.linodeobjects.com" +bucket_name = "cc0" +bucket_url = f"{storage_endpoint}/{bucket_name}" +storage = boto3.resource( + 's3', + endpoint_url=storage_endpoint, + region_name='eu-central-1', + aws_access_key_id=Config.OBJECT_KEY_ID, + aws_secret_access_key=Config.OBJECT_ACCESS_KEY +) +bucket = storage.Bucket(bucket_name) + +def make_public(name): + storage.Object(bucket_name, name).Acl().put(ACL='public-read') def get_url_for(file, username, collection_slug, piece_slug): name = f'{username}-{collection_slug}-{piece_slug}-{secure_filename(basename(file.filename))}' - path = join(dirname(__file__), "static", name) - file.save(path) - - return f"/static/{name}" + bucket.upload_fileobj(file.stream, name) + make_public(name) + return f"{bucket_url}/{name}" def get_type_for(file): return mimetypes.guess_type(file.filename)[0] diff --git a/app/routes.py b/app/routes.py index 56b1684..269f8e7 100644 --- a/app/routes.py +++ b/app/routes.py @@ -186,7 +186,7 @@ def new_piece(username, slug): form = PieceForm() if form.validate_on_submit(): piece_slug = slugify(form.name.data) - existing = Piece.query.filter_by(slug=slug).first() + existing = Piece.query.filter_by(slug=piece_slug).first() if existing is not None: flash(f"that name would need the path {username}/{slug}/{piece_slug}, which is taken") return redirect(url_for('new_piece',