2010-04-09 7 views
52

Ich habe Dateien auf S3 mit einer GUID als Schlüsselnamen gespeichert.Amazon S3 ändern Datei herunterladen Name

ich eine Pre unterzeichnet URL bin mit zum Download per S3 REST API

speichere ich die ursprünglichen Dateinamen in meiner eigenen Datenbank. Wenn ein Benutzer eine Datei von meiner Web-Anwendung zum Download klickt ich ihre ursprünglichen Dateinamen zurückwechseln will, aber zur Zeit alles, was sie bekommen, ist ein GUID. Wie kann ich das erreichen?

Meine Web-App ist in Salesforce, damit ich response.redirects alle die Datei auf dem Web-Server nicht viel Kontrolle zu tun haben, laden Sie es dann umbenennen wegen Gouverneur Einschränkungen.

Gibt es eine HTML-Umleitung, Meta-Refresh, Javascript kann ich verwenden? Gibt es eine Möglichkeit, den Namen der Download-Datei für S3 zu ändern (das einzige, was mir einfällt, ist, das Objekt einem neuen Namen zuzuführen, es herunterzuladen und dann zu löschen).

Ich möchte einen Eimer pro Benutzer zu vermeiden, zu schaffen, wie wir eine Menge von Benutzern und immer noch keine Garantie, jede Datei mit in jedem Eimer einen eindeutigen Namen haben

Alle anderen Lösungen? Haben

+3

Eine andere legit, so dass die Frage, wie Off-Topic ist geschlossen! Auch die Fragen und Antworten haben mehr Stimmen als die überwiegende Mehrheit der üblichen Fragen/Antworten ... – DeepSpace101

+0

Ja, es ist natürlich wichtiger, dass wir versuchen, Dinge etwas willkürlich zu organisieren, angesichts der Tatsache, dass es in der Zukunft keinen Sinn ergibt oder sogar jetzt. Was ist passiert, als die Leute einfach Spaß hatten, Fragen zu stellen und zu beantworten, die mit der Softwareindustrie zu tun hatten? Wer findet eigentlich die Antwort wegen dieser Organisation? Wer findet eine Organisationsstruktur in Software, die konsistent und klar in der Branche definiert ist?Ohne diese klare Definition, die eine beträchtliche Menge an Zeit dauern wird, ist es eine ziemlich dumme Zeitverschwendung ... –

+0

Ich finde diese Antwort, ich habe kein Problem mit dieser Organisation. –

Antwort

59

Ich denke, dein Kreuz diese Fragen zu Amazon S3 forum geschrieben, sondern auch für das Wohl des andere würde Ich mag die Antwort hier posten:

Wenn es immer nur ein „Benutzerdateiname“ für jedes S3-Objekt ist, dann können Sie die Content-Disposition-Header auf Ihrer s3 Datei setzen Sie den Download Dateinamen festlegen: Content-Disposition: attachment; filename = foo.bar

Aus Gründen der Fairness Ich mag würde erwähnen, dass ich es war nicht die richtige Antwort auf Amazon Forum zu bieten und alle Kredite an Colin Rhodes ;-) gehen sollten

+0

ja danke für die Erinnerung. Die andere wichtige Information ist, dass beim Hinzufügen von Content-Disposition die Groß-/Kleinschreibung beachtet wird und sie nicht in x-amz-Präfix benötigt wird. – Daveo

+2

Werfen Sie einen Blick auf die Antwort unten, seit Januar 2011 ist es auch auf eine per GET-Anfrage möglich. Es ist also möglich, so viele "Benutzerdateinamen" zu haben, wie Sie möchten. – fabi

+2

Ich musste dem Dateinamen Zitate hinzufügen, damit dies funktioniert, also war meine Kopfzeile: Content-Disposition: Anhang; filename = "foo.bar" – nathancahill

18

In Anfang Januar 2011 S3 hinzugefügt Anforderungsheaderüberschreibungen. Mit dieser Funktionalität können Sie den Content-Disposition-Header für einzelne Anfragen "dynamisch" ändern.

Siehe S3 documentation on getting objects für weitere Details.

5

Während die akzeptierte Antwort richtig ist finde ich es sehr abstrakt und schwer zu nutzen.

ist hier ein Stück node.js Code, der das Problem löst angegeben. Ich rate, es als AWS Lambda auszuführen, um vor-signierte Url zu generieren.

var AWS = require('aws-sdk'); 
var s3 = new AWS.S3({ 
    signatureVersion: 'v4' 
}); 
const s3Url = process.env.BUCKET; 

module.exports.main = (event, context, callback) => { 
var s3key = event.s3key 
var originalFilename = event.originalFilename 

var url = s3.getSignedUrl('getObject', { 
     Bucket: s3Url, 
     Key: s3key, 
     Expires: 600, 
     ResponseContentDisposition: 'attachment; filename ="' + originalFilename + '"' 
    }); 

[... rest of Lambda stuff...] 

} 

Bitte nehmen Sie zur Kenntnis, ResponseContentDisposition Attribut params Objekt in s3.getSignedUrl Funktion übergeben.

Weitere Informationen unter Funktion doc getObject bei http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property