Thomas, ich habe ähnliche Anforderungen/Probleme und ich denke, ich kann dein Problem beantworten. Zuerst (und ich bin nicht 100% sicher, dass du dich für diesen Teil interessierst), ist das Ausblenden der S3-URL ziemlich einfach, da Amazon dir erlaubt, CNAMES auf deinen Bucket zu verweisen und eine benutzerdefinierte URL anstelle der Amazon-URL zu verwenden. Um dies zu tun, müssen Sie Ihr DNS auf die richtige Amazon-URL verweisen. Als ich meins aufstellte, war es ähnlich: files.domain.com zeigt auf files.domain.com.s3.amazonaws.com. Dann müssen Sie den Bucket mit dem Namen Ihrer benutzerdefinierten URL (files.domain.com in diesem Beispiel) erstellen. Wie man diese URL anruft, hängt davon ab, welches Juwel Sie verwenden, aber ein Wort der Warnung war, dass das von mir verwendete attachment_fu-Plugin mich fälschlicherweise an files.domain.com/files.domain.com/name_of_file schickte .... Ich konnte die Einstellung nicht finden, um es zu beheben, so dass eine einfache .sub-Methode für den S3-Teil des Plugins es reparierte.
On zu Ihren anderen Fragen, einige Schienen-Code (wie die Aufzeichnung der Treffer in der db) auszuführen, bevor Sie dies einfach tun Download:
def download
file = File.find(...
# code to record 'hit' to database
redirect_to 3Object.url_for(file.filename,
bucket,
:expires_in => 3.hours)
end
Dieser Code wird immer noch die Datei bedient werden verursachen, indem sie S3, aber und noch geben Sie die Fähigkeit, etwas Rubin zu laufen. (Natürlich funktioniert der obige Code nicht so wie er ist, Sie müssen ihn auf die richtige Datei und den Bucket verweisen und meine Amazon-Schlüssel werden in einer Konfigurationsdatei gespeichert. Das obige verwendet auch die Syntax für das AWS :: S3-Juwel - http://amazon.rubyforge.org/).
Zweitens ist die Problematik der Content-Disposition: Attachment etwas komplizierter. Hoffentlich ist Ihre Situation ein bisschen einfacher als meine und die folgende Lösung kann funktionieren. Unter der Annahme, das Objekt ‚Datei‘ (in diesem Beispiel) wird das richtige S3-Objekt, können Sie die Disposition zur Befestigung gesetzt durch
file.content_disposition = "attachment"
file.save
Der obigen Code kann ausgeführt werden, nachdem die Datei auf dem Server S3 vorhanden ist (im Gegensatz zu einigen anderen Header und Berechtigungen), das ist nett und es kann auch hinzugefügt werden, wenn Sie die Datei hochladen (Syntax hängt von Ihrem Plugin ab). Ich versuche immer noch, einen Weg zu finden, S3 zu sagen, es als Anhang zu senden und nur auf Anfrage (nicht jedes Mal), und wenn Sie das finden, lassen Sie mich bitte Ihre Lösung wissen. Ich muss in der Lage sein, es manchmal herunterzuladen und andere Zeiten zu speichern, um Bilder (zum Beispiel) in HTML einzubetten. Ich benutze nicht die oben erwähnte Weiterleitung, aber zum Glück scheint es, dass wenn Sie (wie ein HTML-Bild-Tag) eine Datei mit dem Content-disposition/attachment-Header einbetten, und der Browser das Bild normal anzeigt (aber ich nicht gründlich getestet, dass über genügend Browser, um es in der Wildnis zu senden).
Hoffe, dass hilft! Viel Glück.
Sie müssen etwas Ruby-Zeug vor dem Senden der Datei tun? Sie können nicht einfach die URL neu schreiben, müssen Sie die S3 URL verstecken?Nur um zu klären –
Nicht wirklich, aber ich habe zwei Anforderungen: 1) Ich möchte den Download in einem Protokoll aufzeichnen (das ist nicht möglich, wenn der Client die Datei direkt von S3 anfordert). 2) Ich möchte, dass der Benutzer-Browser fragt, die Datei zu speichern, anstatt sie im Browser-Fenster anzuzeigen (heute verwende ich den Header "Content-Disposition: Anhang"). Ich weiß nicht, ob es möglich ist, S3-Links zum Herunterladen als Anhang zu zwingen, anstatt es inline anzuzeigen. –