将图像上传到s3后,上传附带的缩略图

时间:2018-06-09 22:06:43

标签: python django amazon-web-services amazon-s3 python-imaging-library

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

这是我的s3上传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的映像。文件名取自我前端生成的随机字符串。

def upload_image(request):
    random_filename = request.POST.get('random_filename')
    if request.is_ajax():
        if request.FILES:
            for file in request.FILES:
                if file == "image":
                    img = request.FILES.get('image')

        else:
            img = request.POST.get('imageURL')
            img = img_from_url(img)


        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')
def img_from_url(file):
    image_data = requests.get(file).content
    return ContentFile(image_data)

2 个答案:

答案 0 :(得分:1)

使用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")

答案 1 :(得分:0)

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

在其他地方生成

上传原稿时,只需上传其他文件即可。缩略图需要在系统外部生成。

使用AWS Lambda函数生成缩略图

将图像上传到Amazon S3后,它可以生成将运行AWS Lambda函数的事件。然后,Lambda函数可以创建一个新的,已调整大小的图像。

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

使用外部服务

不是存储缩略图,而是使用外部服务即时生成缩略图。一些此类服务是: