2017-07-21 4 views
1

Wie kann ich den Pfad der Bilder ändern, die ich mit Büroklammer und Schienen hochladen. Ich möchte, dass der Pfad im Ordner gov_id meines Buckets enthalten ist und das Bild dort ohne Unterordner verbleibt. Und auch, wie die URL des Bildes zu machen, dieses Format zu folgen: „https://s3-ap-southeast-1.amazonaws.com/BUCKET_NAME/GOV_ID/IMAGE_NAME.EXTENSION“ Hinweis: Ich habe einen gov_id Ordner in meinem Eimerändert Pfad der Bilder auf Amazon S3 hochgeladen mit Paperclip in Rails

Ich habe eine Anlage Modell, das wie folgt aussieht:

class Attachment < ApplicationRecord 
     belongs_to :attachable, polymorphic: true 
     has_attached_file :image, :styles => {:thumb => "200x200#"}, 
         :storage => :s3, 
     validates_attachment :image, content_type: { content_type:  ["image/jpg", "image/jpeg", "image/png"] } 
     validates_attachment :image, presence: true 

     before_save :rename_file 

     def rename_file 
      extension = File.extname(image_file_name).gsub(/^\.+/, '') 
      new_image_file_name = "gov_#{self.attachable.reference_code}.#{extension}" 

      image.instance_write(:file_name, new_image_file_name) 
     end 
    end 

Dies speichert das Bild, das in meinen Bucket hochgeladen wurde, aber nicht im Ordner gov_id. Es geht auf Anlagen/images/000/000/013/Original und die URL wird „s3-ap-southeast-1.amazonaws.com/BUCKET_NAME/attachments/images/000/000/013/original/gov_UG2S463C.png? 1500620951

Antwort

0

Das Problem ist, dass Sie es zuweisen einen neuen Namen und Erfolg, aber Sie sind nicht zu sagen, es zu tun dies in einem Format, das s3 versteht.

Das, was Sie haben sich daran zu erinnern, versuchen ist Diese s3-Buckets funktionieren basierend auf Tasten und Objekte. Wenn Sie einen S3-Bucket betrachten, ist die Ordnerstruktur nur für Show, zum größten Teil. Der Dateipfad (einschließlich des Dateinamens) ist im Wesentlichen der Schlüssel und das Objekt ist das dort gespeicherte Bild (in t sein Fall).

Also, der Schlüssel Sie das Bild zuweisen ist der Standard Büroklammer Pfad (Quelle: paperclip docs), die :file_name

in diesem Block endet in

has_attached_file :image, :styles => {:thumb => "200x200#"}, 
        :storage => :s3, 

Sie haben ein Komma am Ende Ihre has_attached_file, die ich übernehme bedeuten, dass Sie Dinge wie bucket_name: (das ist in Ordnung, aber NEXT_TIME, ersetzt keine sensiblen Informationen mit einem Platzhalter-Namen. es macht das Problem leichter zu verstehen) gelöscht.

sollten Sie haben ein path: Symbol mit dem das S3-Objekt für den Zugriff auf Schlüssel zugeordnet ist. In der Regel generiert Paperclip dies automatisch für Sie, aber Sie möchten es hier manuell zuweisen. So sollten Sie in der Lage sein, so etwas fügen:

has_attached_file :image, :styles => {:thumb => "200x200#"}, 
          :storage => s3, 
          :path => "/gov_id/:class/:attachment/:style/:file_name" 

Wenn Sie möchten, dass die ‚000/000/001‘ dann :path => "/gov_id/:class/:attachment/:id_partition/:style/:file_name" setzen

Ich nehme an, Sie Stil haben wollen es in so dass es beschäftigen sich sowohl mit dem: Original als auch: Daumen Stil.

Auch stattdessen eine BEFORE_SAVE verwenden, könnten Sie in Paperclip.interpolates

aussehen wollen so etwas wie:

has_attached_file :image, :styles => {:thumb => "200x200#"}, 
          :storage => s3, 
          :path => "/gov_id/:class/:attachment/:style/:replaced_file_name" 

Paperclip.interpolates :replaced_file_name do 
    extension = File.extname(image_file_name).gsub(/^\.+/, '') 
    new_image_file_name = "gov_#{self.attachable.reference_code}.#{extension}" 

    new_image_file_name 
end 
Verwandte Themen