Загрузка файла сгенерированного Pillow изображения в s3 с именем файла - PullRequest
0 голосов
/ 26 марта 2020

Я работаю над Python 3 по следующему коду. Предполагается, что это будет API бэкэнд-поста, который будет генерировать изображение со словами «Hello World». Затем я намереваюсь загрузить это сгенерированное изображение до S3 Amazon, а также сохранить его в моей базе данных.

@threads_api_blueprint.route('/', methods=['POST'])
@jwt_required
def create():

user_id = get_jwt_identity()

filename = "img01.png"

fnt = ImageFont.truetype('arial.ttf', 15)
# create new image
image = Image.new(mode="RGB", size=(200, 70), color="red")
draw = ImageDraw.Draw(image)
draw.text((10, 10), "Hello World", font=fnt, fill=(255, 255, 0))
image.save(filename)
breakpoint()


if not upload_file_to_s3(image):
    return jsonify({'msg': 'upload to s3 failed'}), 400

post_image = request.get_json()

post_image = Thread(user_id=user_id,
                     template=image.filename)

post_image.save()

return jsonify({
    'message': 'thread made',
    'user': post_thread.user_id,
    'template': post_thread.template

}), 200

Мой главный аргумент в том, что функция загрузки на s3 ожидает имя файла. Могу ли я явно назначить атрибут имени файла для сгенерированного изображения? В точке останова, которую я вставил выше, я получаю следующий вывод в моем терминале:

(Pdb) image
<PIL.Image.Image image mode=RGB size=200x70 at 0x5679E08>
(Pdb) image.filename
*** AttributeError: 'Image' object has no attribute 'filename'
(Pdb)

Ниже приведен мой вспомогательный файл S3. Я пытался найти похожие ответы, и все они, похоже, указывают на использование буфера, но ни один из них не включает использование имен файлов. Пожалуйста, дайте мне знать, если требуется дополнительная информация. Любая помощь приветствуется.

import boto3
import botocore
from config import Config

s3 = boto3.client(
"s3",
aws_access_key_id=Config.AWS_ACCESS_KEY,
aws_secret_access_key=Config.AWS_SECRET_KEY
)


def upload_file_to_s3(file, acl="public-read"):

try:

    s3.upload_fileobj(
        file,
        Config.AWS_BUCKET_NAME,
        file.filename,
        ExtraArgs={
            "ACL": acl,
            "ContentType": file.content_type
        }
    )

    return True

except Exception as e:

    return False

PS Я в основном получил код подушки из следующего блога: https://pythonprogramming.altervista.org/make-an-image-with-text-with-python/

...