簡體   English   中英

為多個文件預簽名 url?

[英]Pre-signed url for multiple files?

我已經編寫了一個用於為 aws-s3 上的存儲桶生成預簽名 URLS 的實現。 它工作正常,用於獲取單個文件/對象。

我 go 如何為整個目錄生成預簽名的 URLS? 讓我們這樣說吧,在我的 s3 存儲桶上,有多個文件夾和它們自己的小 html5 應用程序。 每個文件夾都有自己的一組html、css、js,還有媒體文件。 在這種情況下,我不會為單個 object 生成預簽名的 URL。

如果我為單個文件提供預簽名 url,例如:文件夾的 index.html,該文件還需要加載 css、js 和媒體文件。 我們沒有簽名 url 的文件。

我只是不太確定如何 go 實現它。

不,他們需要提供一個 API 來允許您先上傳多個文件。 這是 API 的限制,而不是預簽名。

請參閱是否可以批量上傳到亞馬遜 s3? .

否。預簽名 URL 僅對一個對象有效。

這是絕對可能的,並且已經存在多年了。 生成預簽名 URL 時必須使用conditions ,特別是starts-with 請參閱亞馬遜官方文檔

例如,這里是帶有 Boto3 的 Python 生成一個預先簽名的 POST url:

    response = s3.generate_presigned_post(
        "BUCKET_NAME",
        "uploads/${filename}",
        Fields=None,
        Conditions=[["starts-with", "$key", "uploads/"]],
        ExpiresIn=(10 * 60),
    )

第一件事:AWS S3 是一個鍵值存儲,每個對象aaa/bbb/ccc/ddd/index.html只是一個名稱。 沒有“文件夾”的概念(即使您可能有一個錯誤的印象,即它們存在於 UI 中)。

為了為多個“文件”創建單個預簽名 url,您必須進行一些預處理。 在本地拉取所有必要的文件,壓縮它們並將 zip 存檔放在 S3 上,然后生成 zip 存檔的預簽名 URL。

對於在 2021 年查看此問題的任何其他人 - 我發現從 S3 存儲桶下載整個“文件夾”文件的最簡單方法是更改​​我上傳“文件夾”的方式。 我沒有遞歸上傳,而是將對象壓縮到單個 zip 存檔中,然后上傳 zip 存檔。 它不會直接回答問題,而是一種快速的解決方法。 這是我用來解決此問題的示例 Python 代碼:

from shutil import make_archive

from boto3 import client

make_archive(name_of_zipped_folder, 'zip', path_to_outdir)

然后將此壓縮文件夾上傳到 s3

aws s3 cp name_of_zipped_folder s3://bucket_name/name_of_zipped_folder

然后使用 boto3 代碼為該壓縮文件夾生成預簽名的 url

client('s3', 'us-east-1').generate_presigned_url('get_object', Params={'Bucket': bucket_name,'Key': name_of_zipped_folder}, ExpiresIn=120)

這將為 S3 上的現有對象生成一個預先簽名的 URL。 在您的情況下,您可以列出所有對象(使用 keyName)並遞歸調用上述方法。

public String generatePreSignedUrl(String bucketName, String keyName){

    Date expiration = new Date();
    long mSec = 60000l;     //Time in millis
    expiration.setTime(mSec);

    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName);
    generatePresignedUrlRequest.setMethod(HttpMethod.GET);
    generatePresignedUrlRequest.setExpiration(expiration);

    URL url = s3.generatePresignedUrl(generatePresignedUrlRequest);
    return url.toString();
}

PS:AWS SDK 提供 API 來列出存儲桶下的對象,您可以選擇所需的對象。

由於預簽名URL適用於單個object,一種方法是為每個文件(對象)生成簽名。 這可以通過循環來實現。

這是代碼片段:

def upload_files(folder_path, bucket_name, access_key,secret_access_key):

    s3_client = boto3.client('s3', aws_access_key_id=access_key, aws_secret_access_key=secret_access_key)

    for filename in os.listdir(folder_path):
        f = os.path.join(folder_path, filename) #crawls through each file in the directory
        response = s3_client.generate_presigned_post(Bucket = bucket_name,
                Key=f, ExpiresIn = 100) # generates signature for each file
        file = {'file': open(f, 'rb')}
        r = requests.post(response['url'], data=response['fields'],files=file)
        print(r.status_code)

暫無
暫無

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

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