def create_thumbnail(file_path): thumbnail_filename = utils.get_thumb_filename(file_path) thumbnail_format = utils.get_image_format(os.path.splitext(file_path)[1]) file_format = thumbnail_format.split('/')[1] image = utils.get_storage().open(file_path) image = Image.open(image) # Convert to RGB if necessary # Thanks to Limodou on DjangoSnippets.org # http://www.djangosnippets.org/snippets/20/ if image.mode not in ('L', 'RGB'): image = image.convert('RGB') # scale and crop to thumbnail imagefit = ImageOps.fit(image, THUMBNAIL_SIZE, Image.ANTIALIAS) thumbnail_io = BytesIO() imagefit.save(thumbnail_io, format=file_format) thumbnail = InMemoryUploadedFile( thumbnail_io, None, thumbnail_filename, thumbnail_format, len(thumbnail_io.getvalue()), None) thumbnail.seek(0) return utils.get_storage().save(thumbnail_filename, thumbnail)
def upload(request): """ Uploads a file and send back its URL to CKEditor. TODO: Validate uploads """ # Get the uploaded file from request. upload = request.FILES['upload'] #Verify that file is a valid image backend = image_processing.get_backend() try: backend.image_verify(upload) except utils.NotAnImageException: return HttpResponse(""" <script type='text/javascript'> alert('Invalid image') window.parent.CKEDITOR.tools.callFunction({0}); </script>""".format(request.GET['CKEditorFuncNum'])) # Open output file in which to store upload. upload_filename = get_upload_filename(upload.name, request.user) saved_path = utils.get_storage().save(upload_filename, upload) if backend.should_create_thumbnail(saved_path): backend.create_thumbnail(saved_path) url = utils.get_media_url(saved_path) # Respond with Javascript sending ckeditor upload url. return HttpResponse(""" <script type='text/javascript'> window.parent.CKEDITOR.tools.callFunction({0}, '{1}'); </script>""".format(request.GET['CKEditorFuncNum'], url))
def get_image_files(user=None, path=''): """ Recursively walks all dirs under upload dir and generates a list of full paths for each file found. """ # If a user is provided and CKEDITOR_RESTRICT_BY_USER is True, # limit images to user specific path, but not for superusers. STORAGE_DIRECTORIES = 0 STORAGE_FILES = 1 restrict = getattr(settings, 'CKEDITOR_RESTRICT_BY_USER', False) if user and not user.is_superuser and restrict: user_path = user.username else: user_path = '' browse_path = os.path.join(settings.CKEDITOR_UPLOAD_PATH, user_path, path) try: storage_list = utils.get_storage().listdir(browse_path) except NotImplementedError: return except OSError: return for filename in storage_list[STORAGE_FILES]: if os.path.splitext(filename)[0].endswith('_thumb'): continue filename = os.path.join(browse_path, filename) yield filename for directory in storage_list[STORAGE_DIRECTORIES]: directory_path = os.path.join(path, directory) for element in get_image_files(user=user, path=directory_path): yield element
def should_create_thumbnail(file_path): image = utils.get_storage().open(file_path) try: Image.open(image) except IOError: return False else: return True
def get_upload_filename(upload_name, user): # If CKEDITOR_RESTRICT_BY_USER is True upload file to user specific path. if getattr(settings, 'CKEDITOR_RESTRICT_BY_USER', False): user_path = user.username else: user_path = '' # Generate date based path to put uploaded file. date_path = datetime.now().strftime('%Y/%m/%d') # Complete upload path (upload_path + date_path). upload_path = os.path.join( settings.CKEDITOR_UPLOAD_PATH, user_path, date_path) if getattr(settings, "CKEDITOR_UPLOAD_SLUGIFY_FILENAME", True): upload_name = utils.slugify_filename(upload_name) return utils.get_storage().get_available_name(os.path.join(upload_path, upload_name))