Dies ist eine Folge von Garnaats Antwort vom 6. April 12.
Ich erstelle eine signierte URL-Server-Seite, wo ich Anmeldeinformationen habe, und ich übergebe es an einen Client, so dass ein Client Inhalte direkt hochladen kann. Ich vertraue dem Client so weit, dass er Dateien beliebiger Größe hochladen kann, aber nicht genug, um Sicherheitstoken zu geben. Ich wollte vermeiden, dass der Client dem Server mitteilt, wie groß sein Inhalt als Teil der Anfrage wäre. Daher meine Follow-up-Antwort.
Ich konnte die signierte URL für die PUT-Methode arbeiten, ohne die Inhaltslänge in den Headern anzugeben oder force_http = True anzugeben.
Mit Boto 2.31.1: wie in answere der garnaat:
>>> import boto
>>> c =boto.connect_s3()
dann stattdessen verwendet I:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
dies eine URL in der folgenden Form erzeugt:
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
Ich konnte dann curl verwenden, um eine Datei zu posten:
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
Ich hatte eine sehr schwierige Zeit herauszufinden, weil ich normalerweise python requests verwenden, um Tests zu schreiben und zu debuggen; Ich erhalte jedoch einen Fehler bei der Authentifizierung, wenn ich versuche, eine Datei mithilfe von Anfragen an eine dieser boto-generierten signierten URLs zu senden. Ich habe das Problem noch nicht vollständig gelöst, aber ich vermute, dass dies darauf zurückzuführen ist, dass Anfragen einige zusätzliche Header hinzufügen, verglichen mit dem, was curl produziert.
Ich hoffe, diese Follow-up-Antwort schont jemand anderen den Debugging-Schmerz, den ich durchgemacht habe.
Ist das eine neue Datei? Um eine neue Datei zu erstellen, sollten Sie 'POST', nicht' PUT' verwenden. – vartec
@vartec: Was meinen Sie mit "eine neue Datei"? In meinem Anwendungsfall muss ich manchmal einen neuen Schlüssel in einen bestimmten Bucket hochladen, manchmal muss ich den alten Schlüssel überschreiben. Ich denke, ich brauche das Codebeispiel für 'PUT' und 'POST'. –