Carrierwave - 添加或删除图像时,多张图片上传速度过慢

时间:2016-11-08 13:26:00

标签: ruby-on-rails ruby carrierwave image-uploading

我正在关注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 Multiple Uploads功能为我的系统中的模型添加更多图像和删除图像。

该文章的主要代码是

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张图片:例如
  2. 需要5000毫秒
  3. 再添加1张图片:需要8500毫秒(2张图片)
  4. 再添加1张图片:需要12000毫秒(3张图片)
  5. 删除1张图片:需要8400毫秒(返回2张图片)
  6. 我已经在本地计算机上测试了作者编写的此解决方案的示例应用程序,而且速度非常慢。

    看起来CarrierWave重新上传并重新处理所有图像,即使我们只添加或删除1张图像。我想是因为我们正在为@gallery重新分配新的图像数组,以便将旧图像视为新图像。

    此处还有一个相关问题https://github.com/carrierwaveuploader/carrierwave/issues/1704#issuecomment-259106600

    有没有人有更好的解决方案来使用CarrierWave多重上传功能添加和删除图片?

    感谢。

1 个答案:

答案 0 :(得分: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