[英]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 僅對一個對象有效。
第一件事: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.