我可以通过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)
答案 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
使用外部服务
不是存储缩略图,而是使用外部服务即时生成缩略图。一些此类服务是: