簡體   English   中英

Python 在 Lambda 上獲取 s3 object 的 MIME

[英]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 時設置一些元數據,然后根據需要的變化對其進行編輯。

對於filetype lib,您不需要將文件保存在磁盤上。

guess_mime function 也接受bytes數據類型。

啞劇類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM