ruby-on-rails - Carrierwave - 添加或删除图像时多张图像上传速度太慢

标签 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 多次上传功能为我的系统中的模型添加更多图像和删除图像。

那篇文章的主要代码是

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张图片:以5000ms为例
  2. 再添加 1 张图片:需要 8500 毫秒(2 张图片)
  3. 再添加 1 张图片:需要 12000 毫秒(3 张图片)
  4. 删除 1 张图片:需要 8400 毫秒(返回 2 张图片)

我已经在我的本地机器上测试了作者编写的这个解决方案的示例应用程序,它也很慢。

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

这里也有一个相关的问题https://github.com/carrierwaveuploader/carrierwave/issues/1704#issuecomment-259106600

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

谢谢。

最佳答案

当您调用 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.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

关于ruby-on-rails - Carrierwave - 添加或删除图像时多张图像上传速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40488123/

相关文章:

ruby-on-rails - curl : (1) Protocol https not supported or disabled in libcurl

jquery - Rails jQuery 无法在 Assets 管道中工作

ruby-on-rails - 创建自定义验证器

java - Capistrano 找不到 .jar 文件

ruby - 如何测试使用 rspec 的 block 的函数

ruby-on-rails - 在 Rails 中上传文件之前如何删除特殊字符?

ruby-on-rails - Active_support/dependencies.rb :247 `require' : cannot load such file -- 2. 1/pg_ext (LoadError)

ruby - 使用 YARD 记录返回类实例的实例方法的返回类型

ruby-on-rails-3 - 将文件版本动态添加到 Carrierwave uploader

ruby-on-rails - 载波文件删除