Jest to kontynuacja odpowiedzi na garnaat od kwietnia 6 '12.
Generuję stronę ze podpisanym adresem URL serwera, na którym mam poświadczenia i przekazuję ją klientowi, tak aby klient mógł bezpośrednio przesłać zawartość. Ufam klientowi wystarczająco daleko, aby mógł przesyłać pliki o dowolnych rozmiarach, ale nie na tyle, aby nadać mu tokeny zabezpieczające. Chciałem uniknąć sytuacji, w której klient poinformuje serwer o tym, jak duża jego zawartość będzie częścią żądania. Stąd moja odpowiedź.
Udało mi się uzyskać podpisany adres URL działającej metody PUT bez określania długości treści w nagłówkach lub określania force_http = True.
Korzystanie boto 2.31.1: jak w garnaat za answere:
>>> import boto
>>> c =boto.connect_s3()
wtedy zamiast użyłem:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
ten produkowany URL w następującej postaci:
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
Byłem wtedy w stanie użyć curl, aby opublikować plik:
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
Miałem bardzo trudny czas, zastanawiając się nad tym, ponieważ zazwyczaj używam python requests do pisania testów i debugowania; jednak otrzymuję niepowodzenie uwierzytelniania, gdy próbuję go użyć, aby umieścić plik w jednym z tych wygenerowanych boto podpisanych adresów URL za pomocą żądań. Nie w pełni to debugowałem, ale podejrzewam, że tak jest, ponieważ żądania dodają kilka dodatkowych nagłówków w porównaniu do tego, co wytwarza curl.
Mam nadzieję, że ta odpowiedź uzupełniająca sprawi, że ktoś inny przejdzie przez ten debugujący ból.
Czy to nowy plik? Aby utworzyć nowy plik, należy użyć 'POST', a nie' PUT' – vartec
@vartec: Co to znaczy "nowy plik"? W moim przypadku użycia czasami muszę załadować nowy klucz do określonego zasobnika, czasami muszę nadpisać stary klucz. Myślę więc, że potrzebuję przykładu kodu "PUT" i "POST". –