我正在使用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上将文件存储为私有。
答案 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 :(得分:0)
S3 不会为您计算尺寸。无论如何,您事先计算它们。
您可以使用用户定义的元标记。您可以在发送对象时设置它们,或者在它们存在后更新它们。
对于私有对象,API 必须返回用户定义的元标记。
对于公共对象,您可以在对象的公共 url 中使用传统的 GET 动词或仅使用 http HEAD 动词。
即使是 javascript + ajax 也可以读取这个头信息。