2010-09-07 20 views
3

Je travaille sur une application rails où l'utilisateur va télécharger de grandes quantités d'images.Trombone pour télécharger des images vers S3 dans Rails. Les fichiers sont téléchargés à un rythme très lent. Un work-around?

Ma configuration actuelle: en utilisant SWFUpload pour télécharger plusieurs fichiers à la fois en utilisant le plugin Paperclip avec stockage S3. Une fois l'image originale téléchargée sur S3, Delayed_Job est utilisé pour le post-traitement (miniatures, etc.).

Le problème que j'ai est que les images téléchargent à un rythme très lent. Je suppose que la configuration par défaut de Paperclip est que l'image ira de l'utilisateur vers -> mon serveur vers -> s3. Je pensais que je pouvais télécharger les images directement sur s3 mais je ne suis pas sûr de savoir comment les implémenter avec Paperclip et le post-traitement. Je n'ai pas trouvé de plugins ou d'exemples traitant de cela.

Quelqu'un a-t-il des suggestions? Si non, pouvez-vous me pointer dans la bonne direction?

Merci d'avance!

Tim

Répondre

3

J'ai rencontré ce même problème plusieurs fois. La façon dont je l'ai résolu était en créant 2 modèles, un modèle Image et un modèle TempImage, qui hérite du modèle Image. Cela vous oblige à avoir une colonne type sur votre table Image. Le modèle TempImage enregistre l'image localement, puis lorsque vous y accédez directement à partir du modèle Image et que vous le réenregistrez, il suit tout ce qui est défini dans le modèle Image, à savoir Amazon S3.

Exemple:

# Will save in the database as a TempImage inside the Image table 
temp = TempImage.create(:asset => File.new('some_path', 'r')) 

# When you find it again through the Image model, it bypasses the type column 
# so next time you save it, it is saved as an Image. 
amazon = Image.find(temp.id) 
amazon.save! 

Voici mon travail retardé:

class MoveToS3Job < Struct.new(:temp_revision_id) 
    def perform 
    upload = Image.find(temp_revision_id) 
    temp_path = File.expand_path("tmp/uploads/#{upload.asset_file_name}", Rails.root) 
    upload.asset = File.new(temp_path, 'r') 
    upload.save! 

    if File.exists?(temp_path) && !File.directory?(temp_path) 
     File.delete(temp_path) 
    end 
    rescue ActiveRecord::RecordNotFound 
    # If the record wasn't found, do some sort of 
    # error report, but don't keep it in the queue. 
    end 
end 

Voici le modèle TempImage:

class TempImage < Image 
    has_attached_file :asset, { 
    :path => ":rails_root/tmp/uploads/:basename_:updated_at.:extension" 
    } 
end 

Ensuite, le modèle Image d'origine:

class Image < ActiveRecord::Base 
    # Validations 
    validates :asset, :presence => true 

    # Paperclip 
    has_attached_file :asset, :styles => { 
    :preview => ['100x100#', :png], 
    :thumb => ['50x50#', :png] 
    }, 
    :default_style => :thumb, 
    :storage => :s3, 
    :bucket => 'bucket-name', 
    :s3_credentials => File.expand_path('config/s3.yml', Rails.root), 
    :path => "photos/:id_partition/:style.:extension" 
end 

Votre modèle original Image doit toujours contenir votre post-traitement, car cela sera fait en arrière-plan.

Vous pouvez toujours remplacer certaines méthodes pour le rendre un peu plus propre, mais cela vous donne une meilleure idée de la façon dont il fonctionne et ce que vous devez faire pour que vous puissiez le faire fonctionner comme vous le souhaitez.

0

Si vous finissez par aller la route de télécharger directement à S3 qui déleste le travail de votre serveur Rails, s'il vous plaît vérifier mes exemples de projets:

Exemple de projet à l'aide de Rails 3, Flash et MooTools-base FancyUploader à télécharger directement à S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-FancyUploader

Exemple de projet en utilisant Rails 3, flash/Silverlight/GoogleGears/BrowserPlus et Plupload basé sur jQuery pour télécharger directement à S3: https://github.com/iwasrobbed/Rails3-S3-Uploader-Plupload

par ailleurs, vous pouvez faire le post-traitement avec Paperclip en utilisant quelque chose comme ce blog post d Décrit:

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