2013-04-22 3 views

Antwort

81

Wenn der Schlüssel öffentlich lesbar ist (siehe oben) können Sie Key.generate_url verwenden:

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

Wenn der Schlüssel privat ist, und Sie mögen ein auslaufendes URL zu erzeugen, um den Inhalt mit jemandem zu teilen, die nicht über Direktzugriff Sie tun können:

url = key.generate_url(expires_in=300) 

wo expires ist die Anzahl der Sekunden, bevor die URL abläuft. Diese erzeugen HTTPS-URLs. Wenn Sie eine HTTP-URL bevorzugen, verwenden Sie diese:

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

Mit Boto 2.9.6 I 'expires_in = 0 'verwenden musste. 'expires_in = None' hat mir einen Fehler gemeldet. – dirk

+2

Beachten Sie, dass "expires_in = 0" ist "läuft ab sofort!" in boto 2.3.0 –

+3

Wenn der Schlüssel öffentlich ist (zum Beispiel, rufen Sie make_public() auf), expires_in = 0 tut nichts -> die von generate_url generierte URL wird niemals ablaufen. In boto 2.2.2 generiert generate_url (expires_in = None) einen Fehler, weil versucht wird, das Ablaufdatum als "expires = int (time.time() + expires_in)" zu berechnen. –

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') 

Das ist, wie ich es tat in Boto 2.23.0 für eine öffentliche URL. Ich konnte das expires_in = None-Argument nicht zum Funktionieren bringen.

Beachten Sie, dass Sie für HTTPS keine Subdomain verwenden können.

+0

Das funktioniert gut und erfordert keinen Aufruf der S3-API. Danke, dass Sie auch die HTTPS-URL aufgenommen haben. – Seth

+1

Keiner der hier beschriebenen Ansätze erfordert einen Aufruf der S3-API. Einige erfordern, dass Sie Boto installiert haben und wenn das Objekt, zu dem Sie verlinken, öffentlich zugänglich ist, können Sie dies vermeiden, indem Sie den oben gezeigten Ansatz verwenden. – garnaat

+0

Sie können eine Subdomäne verwenden, wenn der Bucket-Name nur einer gültigen Subdomäne entspricht: nur Kleinbuchstaben, Zahlen und Bindestriche. Wenn in Ihrem Beispiel der Bucket wirklich "Name-of-Bucket" wäre, könnten Sie den gleichen Code für "http_url" verwenden, indem Sie einfach https für http austauschen. –

19

Für Boto3, müssen Sie es die folgende Art und Weise zu tun ...

import boto3 

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

Dies ist perfekt für meinen Anwendungsfall, danke! – Patrick

+1

Für boto3 siehe https://stackoverflow.com/questions/33549254/how-to-generate-url-from-boto3-in-amazon-web-services –

Verwandte Themen