def file_upload(request, resize_image=True): from PIL import Image from tempfile import NamedTemporaryFile from sefaria.s3 import HostedFile if request.method == "POST": MAX_FILE_MB = 2 MAX_FILE_SIZE = MAX_FILE_MB * 1024 * 1024 MAX_FILE_DIMENSIONS = (1048, 1048) uploaded_file = request.FILES['file'] if uploaded_file.size > MAX_FILE_SIZE: return jsonResponse({"error": "Uploaded files must be smaller than %dMB." % MAX_FILE_MB}) name, extension = os.path.splitext(uploaded_file.name) with NamedTemporaryFile(suffix=extension) as temp_uploaded_file: temp_uploaded_file.write(uploaded_file.read()) with NamedTemporaryFile(suffix=extension) as temp_resized_file: image = Image.open(temp_uploaded_file) if resize_image: image.thumbnail(MAX_FILE_DIMENSIONS, Image.ANTIALIAS) image.save(temp_resized_file, optimize=True, quality=70) name, extension = os.path.splitext(temp_resized_file.name) hosted_file = HostedFile(filepath=temp_resized_file.name, content_type=uploaded_file.content_type) try: url = hosted_file.upload() return jsonResponse({"status": "success", "url": url}) except: return jsonResponse({"error": "There was an error uploading your file."}) else: return jsonResponse({"error": "Unsupported HTTP method."})
def _handle_image_change(self, old, new): """ When image fields change: 1) delete images that are no longer referenced 2) remove new images from the orphaned files list. """ from sefaria.s3 import HostedFile if old: HostedFile(url=old).delete() if new: HostedFile(url=new).remove_from_orphaned_list()