![](/img/trans.png)
[英]Cannot put object to S3 using aws lambda running on Greengrass
[英]Python Get MIME of s3 object on Lambda
我有一個 lambda 觸發s3 PutObject
。 在繼續之前,lambda 需要檢查文件是否實際上是視頻文件(在我的例子中是 mp4)。 文件擴展名沒有幫助,因為它可能是假的。 所以我嘗試使用在本地機器上工作的FileType 檢查 MIME 。 我不想從 s3 下載大文件,只是下載一部分並保存在本地機器上以檢查它是否是 mp4。 到目前為止我試過這個(在本地機器上) -
import boto3
import filetype
from time import sleep
REGION = 'ap-southeast-1'
tmp_path = "path/src/my_file.mp4"
start_byte = 0
end_byte = 9000
s3 = boto3.client('s3', region_name=REGION)
resp = s3.get_object(
Bucket="test",
Key="MVI_1494.MP4",
Range='bytes={}-{}'.format(start_byte, end_byte)
)
# the file
object_content = resp['Body'].read()
print(type(object_content))
with open(tmp_path, "wb") as binary_file:
# Write bytes to file
binary_file.write(object_content)
sleep(5)
kind = filetype.guess_mime(tmp_path)
print(kind)
但這總是返回None
作為 mimetype。 我想我沒有正確保存二進制文件,任何幫助都會節省我的時間。
TLDR:從 s3 下載大文件的一小部分 -> 保存在 tmp 存儲中 -> 獲取 mime。
Boto3 有一個 function S3.Client.head_object:
HEAD 操作從 object 中檢索元數據,而不返回 object 本身。 如果您只對對象的元數據感興趣,則此操作很有用。 要使用 HEAD,您必須對 object 具有讀取權限。
您可以調用此方法來獲取與 S3 存儲桶項關聯的元數據 object。
metadata = s3client.head_object(Bucket='MyBucketName', Key='MyS3ItemKey')
此元數據包含一個ContentType
屬性,您可以使用此屬性來檢查 object 類型。
要么
如果您不能信任此ContentType
,因為這可能是偽造的。 您可以在上傳對象時簡單地將對象的 MIME 類型保存在 DynamoDB 中。 您可以隨時從那里讀取類型。
要么
您可以簡單地創建一個將被觸發的 Lambda,您可以在 Lambda 中下載 object,因為它有大約 512MB 的臨時存儲空間。 您可以在那里確定內容類型並對其進行更新,因為您還可以在上傳 object 時設置一些元數據,然后根據需要的變化對其進行編輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.