2010-08-09 5 views
5

Ich möchte in der Lage sein, eine ZIP-Datei in meine Rails-Anwendung hochzuladen, die eine Anzahl von Bildern enthält. Dann möchte ich, dass Rails diese Datei entpackt und die Bilder über Paperclip an mein Fotomodell anfügt, damit sie letztendlich auf meinem Amazon S3-Konto gespeichert werden (konfiguriert über Paperclip).Upload und Entpacken von Dateien auf S3 über Rails auf Heroku gehostet?

Ich möchte tun dies alles auf meiner Rails-Website gehostet Heroku, die leider keine lokale Speicherung von jeglicher Art erlaubt (soweit ich weiß) vorübergehend das Entpacken vor dem Paperclip Parsing zu tun.

Wie würde ich das tun ??

Antwort

4

Ich würde empfehlen, direkt auf S3 hochzuladen, was Heroku komplett umgeht, so dass Sie nicht auf das 30-sekündige Anforderungstimeout beschränkt sind (das Ihre Uploads nach diesem Zeitpunkt abbricht) oder das 1gb /tmp Verzeichnislimit. Nachdem die Datei hochgeladen wurde, können Sie mit dem Namen und der Position der Datei einen POST an Ihre Rails-App senden und anschließend den Entpackvorgang ausführen. Wenn Sie Paperclip für die Nachbearbeitung verwenden möchten, habe ich unten einen Link hinzugefügt. Wenn Sie die Route des Hochladens direkt zu S3 durchlaufen, die die Arbeit von Ihrem Rails-Server ablädt, sehen Sie sich bitte meine Beispielprojekte an:

Beispielprojekt mit Rails 3, Flash und MooTools-basiertem FancyUploader zum direkten Hochladen auf S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

Beispielprojekt mit Rails 3, Flash/Silverlight/GoogleGears/Browserplus und-jQuery basierte Plupload laden direkt auf S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

Hier ist der Link für die Büroklammer Nachverarbeitung für ein Beispiel wie Bilder:

http://www.railstoolkit.com/posts/fancyupload-amazon-s3-uploader-with-paperclip

1

Heroku erlaubt Schreiben auf #{RAILS_ROOT}/tmp.

Aber Sie müssen daran denken, dass die Datei nur so lange da sein wird, wie die Anfrage dauert. Wahrscheinlich länger, aber das ist nicht garantiert. Sie könnten versuchen, die Anfrage zu blockieren, während Sie sie entpacken und an S3 senden, aber Sie sollten auf die benötigte Zeit achten.

Es klingt für mich, als ob Sie einen Flash-Uploader benötigen, der ohne Heroku entzippen und an S3 senden kann.

+0

Aber könnte ich meine Paperclip-Assoziationen immer noch in meiner Rails-App machen, wenn ich einen Flash-Uploader verwende, der Heroku umgeht? Etwas verwirrt hier. – neezer

+0

Es gibt ein bisschen hier über den Umgang mit vorhandenen Dateien, nachdem Sie Ihre DB migrieren, um Papiercliop zu verwenden.Sie können Ihre model.attachment einfach auf eine Datei setzen, die dort aufgeführt ist. Könnte Ihnen bei dem helfen, was Sie versuchen zu tun: http://thewebfellas.com/blog/2008/11/2/goodbye-attachment_fu-hello-paperclip –

2

dmagkic stimmt mit dem rails_root/tmp. Ich empfehle etwas wie folgt aus:

  • Hochladen von Dateien über Heroku bis S3
  • Einrichten eines Hintergrundjobs, die Dateien (speichern Sie die Dateinamen, die Sie zum Gruppieren) zip
  • das BJ ausführen, lädt der Dateien von S3, reißt sie, sendet die Zip an S3, entfernt die entpackten Dateien.

Auf diese Weise wird Ihre Anwendung noch während des Hochladens reagieren.

Wenn Sie versuchen, mehrere Dateien hochzuladen, können Sie in/tmp schreiben, aber stellen Sie nur sicher, dass alle Dateien in der gleichen Postanforderung angezeigt werden.

+0

Sie haben Dinge umgekehrt: Ich möchte * eine Zip-Datei hochladen * und haben Rails * speichern die entpackten Dateien *. Mir ist noch unklar, wie lange ich mit den Dateien in '# {RAILS_ROOT}/tmp' arbeiten muss: Bleiben sie bestehen, bis die nächste Anfrage kommt oder laufen sie früher ab? Und muss die Anfrage für die gleiche Aktion oder eine Anfrage an die Anwendung sein? – neezer

+0

OK, ändern Sie einfach die Dinge ein wenig. Laden Sie die ZIP-Datei mit der Büroklammer in S3 hoch und führen Sie einen Hintergrundjob zum Entpacken und Verarbeiten der Dateien durch. Eine Anfrage ist 1 HTTP-Aktion, Sie haben keine Zeit mehr in/tmp. –

Verwandte Themen