2016-11-08 18 views
3

CarrierWave Wiki https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Add-more-files-and-remove-single-file-when-using-default-multiple-file-uploads-featureでこの記事を読んで、CarrierWave複数アップロード機能を使用して、Carrierwave - 画像を追加または削除する際に複数の画像のアップロードが遅すぎる

その記事のメインコードは、それが動作する

def add_more_images(new_images) 
    images = @gallery.images 
    images += new_images 
    @gallery.images = images 
end 

def remove_image_at_index(index) 
    remain_images = @gallery.images # copy the array 
    deleted_image = remain_images.delete_at(index) # delete the target image 
    deleted_image.try(:remove!) # delete image from S3 
    @gallery.images = remain_images # re-assign back 
end 

です。 しかし、それはあまりにもスローです。 Iログを見ていると、全体の処理時間は次の通りである:

  1. アップロード1枚の画像:それは追加
  2. 8500ms(2イメージ)かかり:それは1以上の画像を追加
  3. 例えば5000msを取ります1枚の以上の画像:それは
  4. 12000ms(3枚の画像)かかり1枚の画像を削除します。それは私が私のローカルマシン上の著者によって書かれたこのソリューションのサンプルアプリケーションをテストしている(バック2枚の画像へ)8400ms

を取りますそれは非常に遅すぎる。

CarrierWaveは1枚の画像を追加または削除するだけで、すべての画像を再アップロードして再処理するようです。私は、古い画像を新しいものとして扱うように、新しい画像の配列を@galleryに再割り当てしているためだと思います。

はまた、関連する問題がここにhttps://github.com/carrierwaveuploader/carrierwave/issues/1704#issuecomment-259106600

あり誰もがCarrierWave複数のアップロード機能を使用して画像を追加および削除する任意のより良い解決策を持っていますか?

ありがとうございました。

答えて

0

model.images = remain_imagesに電話すると、carrierwaveがすべての画像をアップロードします。したがって、列に格納される画像が多いほど、時間がかかります。 を参照してください:mount.rb#L300mounter.rb#L40

を、私は、前にこの問題を抱え以下は私のコードです:

new_images = self.logo_images.clone 
4.times do |t| 
    next if !(image = params[:"logo_image#{t + 1}"]) 
    new_images[t] = image 
    changed = true 
end 
self.logo_images = new_images if changed 
... 
self.save if changed 

そして、これはハックです...

carrierwave 1.0.0carrierwave-aws 1.1.0で正常に動作します)

mounter = self.send(:_mounter, :logo_images) 
4.times do |t| 
    next if !(image = params[:"logo_image#{t + 1}"]) 
    uploader = mounter.blank_uploader 
    uploader.cache!(image) 
    mounter.uploaders[t] = uploader 
    changed = true 
end 
mounter.uploaders.each{|s| s.send(:original_filename=, s.file.filename) if !s.filename} if changed 
... 
self.save if changed 
関連する問題