2016-11-08 76 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 

它的工作原理。 但是,它太懶惰了。我已經看過在日誌和總處理時間是如下:

  1. 上傳1個圖像:它需要5000毫秒例如
  2. 添加1多個圖像:它需要8500ms(2個圖像)
  3. 添加1多個圖像:它需要12000ms(3個圖像)
  4. 刪除1個圖像:它需要8400ms(回到2個圖像)

我已經測試我的本地機器上寫入由作者這種解決方案的示例應用程序而且非常也慢。

好像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