2017-05-15 1 views
1

Was ich erreichen möchte, ist einen Link zu generieren, um die Datei (ex.image oder pdf) anzuzeigen. Der Artikel ist nicht per URL zugänglich (https://[bucket].s3.amazonaws.com/img_name.jpg), denke ich, weil es privat und nicht öffentlich ist? (Ich bin nicht der Besitzer des Eimers, aber er gab mir den access_key und secret_key?)Wie man Bild durch URL auf s3 unter Verwendung von boto3 zugreift?

Jetzt kann ich nur eine Datei mit diesem Code herunterladen.

s3.Bucket('mybucket').download_file('upload/nocturnes.png', 'dropzone/static/pdf/download_nocturnes.png') 

Ich möchte auf s3 ein Bild zuzugreifen, so kann ich es auf einer HTML setzen, kann ich es sehen den Zugang und die geheimen Schlüssel ?. Danke für die, die helfen können!

+0

Bei hohem Verkehrsaufkommen ist die Datei, ziehen sie abrufen mache diesen direkten Dateiabruf nicht. – mootmoot

+0

@mootmoot warum? und wie soll ich retrieval machen? –

+0

Lernoption zur Verwendung von CDN. Da AWS für die Datenübertragung von AWS, die keine Cloudfront-Funktion verwendet, 0,09 US-Dollar/GB verlangt. – mootmoot

Antwort

4

Sie können dies mithilfe einer vorzeichneten URL mit der Funktion generate_presigned_url erreichen. Der Vorbehalt besteht darin, dass vor-signierte URLs ein Ablaufdatum haben müssen. Ich konnte keine Dokumentation zur maximal zulässigen Dauer finden. Hier ein Beispiel:

url = s3.generate_presigned_url('get_object', 
           Params={ 
            'Bucket': 'mybucket', 
            'Key': 'upload/nocturnes.png', 
           },         
           ExpiresIn=3600) 
print url 
+0

Danke, das ist, was ich gesucht habe. Ich kann endlich das Bild von s3 auf meine Seite stellen. Aber ich habe ein neues Problem, ich benutze eine js-Bibliothek (pdf.js), um die PDF-Datei von Amazon auf meiner Website anzuzeigen. Aber es erzeugt eine "Cross-Origin-Anfrage blockiert: Die gleiche Herkunft Richtlinie verbietet das Lesen der Remote-Ressource bei .....", aber es ist eine andere Frage, nochmals vielen Dank. –

+1

@jordanm Falls Sie neugierig sind, beträgt die maximale Zeit in jeder AWS-Region 604800 Sekunden (7 Tage). Ältere Regionen scheinen Abschlüsse über das Jahr 2038 hinaus zu unterstützen, wenn die URL mit der Signaturversion 2 signiert ist, aber 7 Tage ist der Wert, der überall funktioniert. Wenn die Zugriffsschlüssel-ID, die die URL signiert hat, deaktiviert/gelöscht wird, werden auch alle von diesem Schlüssel signierten URLs unbrauchbar und da die Zugriffsschlüsselrotation eine bewährte Methode ist, bleiben signierte URLs nur so lange gültig, wie Ihre Schlüsselrotationsrichtlinie dies zulässt. –

0

Für Menschen, die generate_presigned_url für ein öffentliches Objekt verwenden möchten, und deshalb wollen nicht die Unterzeichnung Teil zu tun, die Anmeldeinformationen anhängt, ist die beste Lösung, die ich gefunden ist immer noch zu den generate_presigned_url zu verwenden , nur dass die Client.Config.signature_version auf botocore.UNSIGNED eingestellt werden muss.

Der folgende gibt den öffentlichen Link ohne die Signierkram zurück.

config.signature_version = botocore.UNSIGNED 
boto3.client('s3', config=config).generate_presigned_url('get_object', ExpiresIn=0, Params={'Bucket': bucket, 'Key': key}) 

Die relevanten Diskussionen über die boto3 Repository sind:

Verwandte Themen