上传图片到s3后,上传附带的拇指

2024-04-23 17:45:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以通过AJAX成功地将图像上传到s3。但是我需要在我的s3桶里有一个附带的缩略图。在

以下是我的s3 upload ajax视图:

...
session = boto3.Session(
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
)
s3 = session.resource('s3')

s3.Bucket('****-bucket').put_object(Key='media/%s' % random_filename, Body=img, ContentType='image/png')
return HttpResponse()

从我的代码中创建和上传缩略图的最佳方法是什么?我是否要在我当前的下添加另一个put_object?如果是这样,我如何实现像PIL这样的缩略图生成器?我试图复制this answer,但是设置与我的完全不同。在

或者使用AWS lambda函数代替它是否可行?在

任何建议都可以。在

编辑:

可以通过两种方式上传文件:从磁盘上传图像和从URL上传图像。文件名取自在我的前端生成的随机字符串。在

^{pr2}$
def img_from_url(file):
    image_data = requests.get(file).content
    return ContentFile(image_data)

Tags: key图像imageawsimgreturnobjects3
2条回答

生成缩略图有三种基本方法(可能更多!)。在

在别处生成

上传原始文件时只需上传一个附加文件。缩略图需要在系统外部生成。在

使用AWS Lambda函数生成缩略图

当图像上传到amazons3时,它可以生成一个运行AWS Lambda函数的事件。然后Lambda函数可以创建一个新的、调整大小的图像。在

有关示例,请参见:Tutorial: Using AWS Lambda with Amazon S3 - AWS Lambda

使用外部服务

与其存储缩略图,不如使用外部服务动态生成缩略图。一些此类服务包括:

使用OpenCV调整图像大小并将其编码为字节,然后让Boto3将这些字节上传到S3,并为缩略图指定一个新的键名:

import boto3
import cv2

BUCKET_NAME = "MY_BUCKET_NAME"

# Load original image from disk
original_image_filename = "original_image.png"
original_image = cv2.imread(original_image_filename)

# Resize the original image to obtain a thumbnail image,
# and encode this thumbnail to bytes in the PNG format
thumbnail_image = cv2.resize(original_image, (100, 100))
thumbnail_image_png = cv2.imencode(".png", thumbnail_image)[1].tostring()

# Upload the PNG bytes of the thumbnail to S3
s3 = boto3.resource("s3")
thumbnail_image_filename = "thumbnail.png"
object = s3.Object(BUCKET_NAME, thumbnail_image_filename)
object.put(Body=thumbnail_image_png, ContentType="image/png")

相关问题 更多 >