2013-04-22 65 views

回答

81

如果關鍵是公開可讀(如上圖所示),可以使用Key.generate_url

url = key.generate_url(expires_in=0, query_auth=False) 

如果是私有的,要生成一個過期的網址與他人共享誰沒有內容您可以直接訪問:

url = key.generate_url(expires_in=300) 

其中expires是URL到期前的秒數。這些將產生HTTPS網址。如果你喜歡一個HTTP URL,使用此:

url = key.generate_url(expires_in=0, query_auth=False, force_http=True) 
+13

隨着博託2.9.6我必須使用'expires_in = 0'。 'expires_in = None'給了我一個錯誤。 – dirk 2013-06-26 21:09:20

+2

值得注意的是'expires_in = 0'是「立即過期!」在博託2.3.0 – 2013-12-06 11:54:53

+3

如果密鑰是公開的(例如,你調用make_public()),expires_in = 0什麼也不做 - > generate_url生成的url永遠不會過期。在boto 2.2.2中,generate_url(expires_in = None)拋出一個錯誤,因爲試圖計算過期日期爲「expires = int(time.time()+ expires_in)」 – 2014-03-06 12:16:32

8
import boto 
from boto.s3.connection import S3Connection 

conn = S3Connection('AWS_ACCESS_KEY', 'AWS_SECRET_KEY') 

secure_https_url = 'https://{host}/{bucket}/{key}'.format(
    host=conn.server_name(), 
    bucket='name-of-bucket', 
    key='name_of_key') 

http_url = 'http://{bucket}.{host}/{key}'.format(
    host=conn.server_name(), 
    bucket='name-of-bucket', 
    key='name_of_key') 

這是我做到了在博託2.23.0爲公共URL。我無法使expires_in = None參數正常工作。

請注意,對於HTTPS,您不能使用子域。

+0

這很好,不需要調用S3 API。感謝您也包含HTTPS網址。 – Seth 2014-02-17 18:17:11

+1

這裏描述的方法都不需要調用S3 API。有些確實需要你安裝boto,如果你連接的對象是公開的,你可以通過使用上面的方法來避免這種情況。 – garnaat 2014-03-06 12:48:39

+0

如果存儲桶名稱僅與有效的子域匹配,則可以使用子域:只有小寫字母,數字和破折號。在你的例子中,如果這個桶真的是「名字桶」,你可以使用'http_url'的相同代碼,只需要交換https即可。 – 2015-05-13 19:19:56

19

對於Boto3,你需要做的是通過以下方式...

import boto3 

s3 = boto3.client('s3') 
url = '{}/{}/{}'.format(s3.meta.endpoint_url, bucket, key) 
+0

這是完美的我的用例,謝謝! – Patrick 2016-11-30 04:43:42

+1

對於boto3請參閱https://stackoverflow.com/questions/33549254/how-to-generate-url-from-boto3-in-amazon-web-services – 2017-06-09 19:18:18

相關問題