2017-11-30 25 views
0

Ich versuche, die Paperclip hochgeladen Bilder speichern einen Sidekiq Arbeiter zu speichern. Der Benutzer wählt die Bilder in ein Bild [] und übergibt sie an den Controller (als Parameter [: Bild]).Speichern Paperclip Bild mit Sidekiq

Ausblick:

<%= file_field_tag "image[]", type: :file, multiple: true %> 

Wenn ich es auf einen anderen var (Dateien) übergeben, es in die Steuerung funktioniert, aber wenn ich es dem sidekiq_worker passieren, verwandelt es in einen Hash von Strings

Controller:

file = params[:image] 
SidekiqWorker.perform_async("import_images", file) 

SidekiqWorker

def perform(type, file) 
    case type 
    when "import_images" 
     file.each do |picture| 
      puts picture.class 
      puts picture.original_filename 
     end 
     Product.import_images(file) 
     puts "SIDEKIQ_WORKER: IMPORTING IMAGES" 
    end 
end 

Wie kann ich einen Hash von Image-Hashes übergeben? Oder wie kann ich erreichen, was ich tun möchte?

Danach werden die Bilder zu einem Modell verarbeitet, aber der Hash wurde bereits in eine Zeichenfolge umgewandelt und es funktioniert nicht.

def self.import_images(file) 
file.each do |picture| 
    @product = Product.where(code: File.basename(picture.original_filename, ".*")) 
    if([email protected]?) 
     @product.update(:image=> picture) 
    end 
    end 
end 

Vielen Dank für Ihre Hilfe :)

+0

sorry, warum mit sidekiq? Sie können dies einfach mit Carrierwave mehrere Bilder hochladen, es gibt so viele Anleitungen dazu und Sie können auf Amazon S3-Speicher hochladen https://github.com/carrierwaveuploader/carrierwave#multiple-file-uploads https: // stackoverflow .com/questions/19712816/carrierwave-rails-4-und-multiple-uploads –

+0

Ich benutze Heroku und manchmal die Anwendungszeit, abhängig von der Anzahl der hochgeladenen Bilder. Ich brauche dies in einem zweiten Plan-Prozess Kann ich das mit Carrierwave tun? Danke :) –

+0

Ich weiß nicht wirklich darüber. Es tut uns leid. –

Antwort

0

Also, was ich tat es einfach geschehen lassen ...

Nachdem der Benutzer die Dateien hochgeladen, es speichert sie in einem Ordner und einem Variable im Controller erhält den Namen jedes Bildes.

when "Import images" 
    file = Array.new 
    params[:image].each do |picture| 
    File.open(Rails.root.join('public/system/products', 'uploaded', picture.original_filename), 'wb') do |f| 
     f.write(picture.read) 
    end 
    file.push picture.original_filename 
    end 
    SidekiqWorker.perform_async("import_images", file,0,0) 
    redirect_to products_url, notice: "#{t 'controllers.products.images'}" 

Danach läuft es meine sidekiq_worker und geht auf mein Modell, wo ich für das Bild zu suchen und für das Produkt suchen, wo der Code den Namen des Bildes entspricht. Nach der Verarbeitung löscht die Datei des hochgeladenen Bildes :)

def self.import_images(file) 
file.each do |image| 
    uploaded = open("public/system/products/uploaded/"+image) 
    prd = Product.where(code: File.basename(uploaded, '.*')) 
    if !prd.nil? 
    prd.update(image: uploaded) 
    end 
    File.delete("public/system/products/uploaded/"+image) 
end 

Ende

Verwandte Themen