获取存储在Laravel中的AWS S3 Bucket上的图像文件的宽度和高度

时间:2018-05-18 16:41:10

标签: laravel amazon-web-services amazon-s3

我正在使用Laravel开发Web应用程序。我将所有图像文件存储在AWS S3 Bucket上。现在,我想获得存储在s3上的图像文件的宽度和高度。但是,我将所有图像文件存储为私有,以便我无法从s3网址访问它们。在我的代码中,我从s3下载图像文件

file = Storage::disk('s3')->get($s3_file_name);

如果我想在浏览器中显示图像,我会在动作方法中返回图像。

return response($file)->header('Content-Type', 'image/png');

但我喜欢在从s3下载之后获得图像的宽度和高度。

file = Storage::disk('s3')->get($s3_file_name);

我怎样才能得到它?

我无法使用getimagesize(filename),因为我在s3 Bucket上将文件存储为私有。

2 个答案:

答案 0 :(得分:0)

您可以创建一个在上传图像时触发的lambda函数,自动计算维度并将结果存储在dynamodb表中,然后您可以使用laravel代码引用存储在dynamodb表中的结果。

使用python很容易:

from PIL import Image
import boto3

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.unquote_plus(
            event['Records'][0]['s3']['object']['key'].encode('utf8'))

    s3 = boto3.client('s3')
    dynamodb = boto3.client('dynamodb')

    local = '/tmp/'+key
    s3.download_file(bucket,key, local)
    im = Image.open(local)

    width, height = im.size

    dynamodb.put_item(
        TableName='dimension',
        Item={
           'keyname': {'S': key},
           'height': {'N': height},
           'width': {'N': width}
            })

<强>先决条件:

1.不要忘记将一个名为 dimension keyname 的dynamodb表作为主键

  1. 由于PIL或PILLOW不是lambda环境中的标准python库,你必须创建一个自定义的deploment包,以下是你将如何做到这一点: https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python

答案 1 :(得分:0)

S3 不会为您计算尺寸。无论如何,您事先计算它们。

您可以使用用户定义的元标记。您可以在发送对象时设置它们,或者在它们存在后更新它们。

对于私有对象,API 必须返回用户定义的元标记。

对于公共对象,您可以在对象的公共 url 中使用传统的 GET 动词或仅使用 http HEAD 动词。

即使是 javascript + ajax 也可以读取这个头信息。