Ich habe Dateien in S3 mit einer GUID als Schlüsselnamen gespeichert.
Ich verwende eine vorsignierte URL zum Herunterladen gemäß der S3-REST-API
Ich speichere den ursprünglichen Dateinamen in meiner eigenen Datenbank. Wenn ein Benutzer auf klickt, um eine Datei von meiner Webanwendung herunterzuladen, möchte ich seinen ursprünglichen Dateinamen zurückgeben. Derzeit erhält er jedoch nur eine GUID . Wie kann ich das erreichen?
Meine Web-App befindet sich in Salesforce, daher habe ich nicht viel Kontrolle über die Antwort. Leitet alle Dateien herunter, die auf den Webserver heruntergeladen wurden, und benennt sie dann aufgrund von Governor-Einschränkungen um.
Gibt es eine HTML-Umleitung, Meta-Aktualisierung, Javascript, die ich verwenden kann? Gibt es eine Möglichkeit, den Namen der Download-Datei für S3 zu ändern (ich kann mir nur vorstellen, das Objekt unter einen neuen Namen zu kopieren, herunterzuladen und dann zu löschen).
Ich möchte vermeiden, einen Bucket pro Benutzer zu erstellen, da wir viele Benutzer haben und dennoch nicht garantieren können, dass jede Datei in jedem Bucket einen eindeutigen Namen hat
Irgendwelche anderen Lösungen?
Antworten:
Ich denke, Ihr Kreuz hat diese Fragen im Amazon S3-Forum gepostet , aber für andere möchte ich die Antwort hier posten:
Wenn es für jedes S3-Objekt immer nur einen "Benutzerdateinamen" gibt, können Sie den Content-Disposition-Header in Ihrer S3-Datei festlegen, um den Download-Dateinamen festzulegen: Content-Disposition: Anhang; Dateiname = foo.bar
Aus Gründen der Fairness möchte ich erwähnen, dass ich nicht die richtige Antwort im Amazon-Forum gegeben habe und alle Credits an Colin Rhodes gehen sollten ;-)
quelle
https://...example.txt?response-content-disposition=attachment;filename=foo.bar
Obwohl die akzeptierte Antwort richtig ist, finde ich sie sehr abstrakt und schwer zu verwenden.
Hier ist ein Teil des Codes von node.js, der das angegebene Problem löst. Ich empfehle, es als AWS Lambda auszuführen, um eine vorsignierte URL zu generieren.
Bitte beachten Sie das
ResponseContentDisposition
Attribut desparams
in dies3.getSignedUrl
Funktion übergebenen Objekts .Weitere Informationen finden Sie unter getObject function doc unter http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property
quelle
originalFilename
as-Parameter ausführe .Anfang Januar 2011 hat S3 Anforderungsheader-Überschreibungen hinzugefügt. Mit dieser Funktion können Sie den Content-Disposition-Header für einzelne Anforderungen "dynamisch" ändern.
Weitere Informationen finden Sie in der S3- Dokumentation zum Abrufen von Objekten .
quelle
Für Java AWS SDK unten sollte Code Snippet die Aufgabe erledigen:
quelle
Mit C # unter Verwendung von AWSSDK,
quelle
Ich habe das gleiche Problem, ich habe es gelöst, indem ich den http-Header "content-disposition" gesetzt habe, während ich die Datei an S3 gesendet habe. Die SDK-Version ist AWS SDK für PHP 3.x. Hier ist das Dokument http://docs.amazonaws.cn/en_us/aws-sdk-php/latest/api-s3-2006-03-01.html#putobject
ein Stück meines Codes
quelle
Es sieht so aus: response_content_disposition ist in der presigned_url-Methode nicht dokumentiert. Das hat bei mir funktioniert
quelle