From 7c68cb7fb4879c511d466bc2056335169e2c672f Mon Sep 17 00:00:00 2001 From: gabriel Date: Wed, 6 May 2015 13:06:23 -0300 Subject: [PATCH] Add thumbnail support based on Dropbox design Size implemented, Format still missing --- attract/application/file_server.py | 56 +++++++++++++++++++++++++++++- requirements.txt | 2 ++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/attract/application/file_server.py b/attract/application/file_server.py index e9e90188..234b37b1 100644 --- a/attract/application/file_server.py +++ b/attract/application/file_server.py @@ -5,12 +5,67 @@ from flask import request from application import app +from PIL import Image file_server = Blueprint('file_server', __name__, template_folder='templates', static_folder='static/storage') +@file_server.route('/file/thumbnail/') +def thumbnail(file_name=None): + folder_name = file_name[:2] + file_folder_path = os.path.join(app.config['FILE_STORAGE'], + folder_name) + # The original file exists? + file_path = os.path.join(file_folder_path, file_name) + if not os.path.isfile(file_path): + return "", 404 + + format_ = "jpeg" + formats = ["jpeg", "png"] + size = "s" + sizes = ["xs", "s", "m", "l", "xl"] + size_dict= { + "xs": (32, 32), + "s": (64, 64), + "m": (128, 128), + "l": (640, 480), + "xl": (1024, 768) + } + if "format" in request.args: + if request.args['format'] in formats: + format_ = request.args['format'] + if "size" in request.args: + if request.args['size'] in sizes: + size = request.args['size'] + + # The Thumbnail already exist? + thumbnail_folder_path = os.path.join(file_folder_path, size) + thumbnail_file_path = os.path.join(thumbnail_folder_path, file_name) + if os.path.isfile(thumbnail_file_path): + file_static_path = os.path.join("", folder_name, size, file_name) + return file_server.send_static_file(file_static_path) + + # Create thumbnail + if not os.path.exists(thumbnail_folder_path): + os.mkdir(thumbnail_folder_path) + if not os.path.isfile(thumbnail_file_path): + try: + im = Image.open(file_path) + except IOError: + return "", 500 + im.thumbnail(size_dict[size]) + try: + im.save(thumbnail_file_path) + except IOError: + raise + return "", 500 + + file_static_path = os.path.join("", folder_name, size, file_name) + return file_server.send_static_file(file_static_path) + return "", 500 + @file_server.route('/file', methods=['POST']) @file_server.route('/file/') def index(file_name=None): @@ -18,7 +73,6 @@ def index(file_name=None): if file_name: folder_name = file_name[:2] file_path = os.path.join("", folder_name, file_name) - print (file_path) return file_server.send_static_file(file_path) #POST file file_name = request.form['name'] diff --git a/requirements.txt b/requirements.txt index 670181fe..b1a7190a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,8 +6,10 @@ Flask-PyMongo==0.3.0 Flask-Script==2.0.5 Jinja2==2.7.3 MarkupSafe==0.23 +Pillow==2.8.1 Werkzeug==0.10.1 argparse==1.2.1 +distribute==0.6.24 itsdangerous==0.24 pymongo==2.8 requests==2.6.0