Mam pliki zapisane na S3 z identyfikatorem GUID jako nazwą klucza.
Używam wstępnie podpisanego adresu URL do pobrania zgodnie z interfejsem API REST S3
Przechowuję oryginalną nazwę pliku w mojej własnej bazie danych. Kiedy użytkownik kliknie, aby pobrać plik z mojej aplikacji internetowej , chcę zwrócić jego oryginalną nazwę pliku, ale obecnie wszystko, co otrzymuje, to identyfikator GUID . Jak mogę to osiągnąć?
Moja aplikacja internetowa jest w Salesforce, więc nie mam dużej kontroli nad odpowiedzią. Przekierowuje wszystkie pobieranie pliku na serwer sieciowy, a następnie zmienia jego nazwę z powodu ograniczeń zarządcy.
Czy jest jakieś przekierowanie HTML, odświeżanie meta, JavaScript, którego mogę użyć? Czy istnieje sposób na zmianę nazwy pliku pobierania dla S3 (jedyne, o czym przychodzi mi do głowy, to skopiowanie obiektu do nowej nazwy, pobranie go, a następnie usunięcie).
Chcę uniknąć tworzenia zasobnika na użytkownika, ponieważ będziemy mieć wielu użytkowników i nadal nie ma gwarancji, że każdy plik w każdym zasobniku będzie miał niepowtarzalną nazwę
Jakieś inne rozwiązania?
Odpowiedzi:
Domyślam się, że Twój krzyż opublikował to pytanie na forum Amazon S3 , ale dla dobra innych chciałbym zamieścić odpowiedź tutaj:
Jeśli istnieje tylko jedna „nazwa pliku użytkownika” dla każdego obiektu S3, możesz ustawić nagłówek Content-Disposition w pliku s3, aby ustawić nazwę pobierania: Content-Disposition: załącznik; filename = foo.bar
Ze względu na uczciwość chciałbym wspomnieć, że to nie ja udzieliłem właściwej odpowiedzi na forum Amazona i wszystkie kredyty powinny trafić do Colina Rhodesa ;-)
źródło
https://...example.txt?response-content-disposition=attachment;filename=foo.bar
Chociaż przyjęta odpowiedź jest prawidłowa, uważam ją za bardzo abstrakcyjną i trudną do wykorzystania.
Oto fragment kodu node.js, który rozwiązuje przedstawiony problem. Radzę wykonać to jako AWS Lambda w celu wygenerowania wstępnie podpisanego adresu URL.
Proszę zwrócić uwagę na
ResponseContentDisposition
atrybutparams
obiektu przekazany dos3.getSignedUrl
funkcji.Więcej informacji w dokumencie funkcji getObject pod adresem http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
źródło
originalFilename
parametrem as.Na początku stycznia 2011 r. S3 dodał nadpisania nagłówka żądania. Ta funkcja umożliwia „dynamiczną” zmianę nagłówka Content-Disposition dla poszczególnych żądań.
Zobacz dokumentację S3 dotyczącą pobierania obiektów, aby uzyskać więcej informacji.
źródło
W C # używającym AWSSDK,
źródło
W przypadku zestawu Java AWS SDK poniżej fragment kodu powinien wykonać zadanie:
źródło
Mam ten sam problem, rozwiązałem go ustawiając nagłówek http "content-disposition" podczas przesyłania pliku do S3, wersja SDK to AWS SDK dla PHP 3.x. tutaj jest dokument http://docs.amazonaws.cn/en_us/aws-sdk-php/latest/api-s3-2006-03-01.html#putobject
kawałek mojego kodu
źródło
Wygląda na to, że: response_content_disposition nie jest udokumentowana w metodzie presigned_url. To właśnie zadziałało dla mnie
źródło
Korzystanie z Pythona i Boto v2:
źródło