2016-11-08 3 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, чтобы реализовать добавление большего количества изображений и удаление изображений для модели в моей системе с использованием функции Multiple Uploads 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 

Он работает. Однако, это слишком slooooow. Я посмотрел на журнал и общее время обработки выглядит следующим образом:

  1. Загрузить 1 изображение: она занимает 5000 мс, например
  2. Добавить еще один образ: он принимает 8500ms (2 изображения)
  3. Добавить 1 более изображений: оно принимает 12000ms (3 изображения)
  4. Извлеките 1 изображение: оно принимает 8400ms (обратно 2 изображения)

Я проверил пример приложения этого решения, написанный автором на моей локальной машине и это было очень слишком медленный.

Кажется, что CarrierWave перезагружает и перерабатывает все изображения, даже мы добавляем или удаляем только одно изображение. Я думаю, потому что мы повторно назначаем новый массив изображений на @gallery, чтобы обрабатывать старые изображения как новые.

Также есть смежный вопрос здесь https://github.com/carrierwaveuploader/carrierwave/issues/1704#issuecomment-259106600

Кто-нибудь есть лучшее решение для добавления и удаления изображений с использованием CarrierWave функции множественного загрузки?

Спасибо.

ответ

0

при звонке model.images = remain_images, carrierwave загрузит все изображения. Таким образом, чем больше изображений вы храните в столбце, тем дольше это займет. См: mount.rb#L300, mounter.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.0 и carrierwave-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 
Смежные вопросы