Ruby on rails 在上传到Cloudinary后对图像进行后期处理时,是否有办法解决ActiveStorage完整性错误?

Ruby on rails 在上传到Cloudinary后对图像进行后期处理时,是否有办法解决ActiveStorage完整性错误?,ruby-on-rails,file-upload,error-handling,cloudinary,rails-activestorage,Ruby On Rails,File Upload,Error Handling,Cloudinary,Rails Activestorage,我目前正在使用Rails(6.0.3.2)开发Rails应用程序。我正在使用ActiveStorage和Cloudinary gem将照片上载到Cloudinary 上传照片时一切正常。然而,当我在Cloudinary上设置一个规则,在上传日志时调整照片大小时,我的日志最终充满了以下错误。具体来说,照片会调整大小,然后保存到云存储中,替换原始照片,而不仅仅是创建变体。我相信这就是问题所在 2020-10-09T04:47:28.917859+00:00 app[web.1]: I, [2020-

我目前正在使用Rails(6.0.3.2)开发Rails应用程序。我正在使用ActiveStorage和Cloudinary gem将照片上载到Cloudinary

上传照片时一切正常。然而,当我在Cloudinary上设置一个规则,在上传日志时调整照片大小时,我的日志最终充满了以下错误。具体来说,照片会调整大小,然后保存到云存储中,替换原始照片,而不仅仅是创建变体。我相信这就是问题所在

2020-10-09T04:47:28.917859+00:00 app[web.1]: I, [2020-10-09T04:47:28.917748 #9]  INFO -- : 
[ActiveJob] Enqueued ActiveStorage::AnalyzeJob (Job ID: 09e91b28-ee03-48e8-b04f-7120a06910b8)
 to Async(active_storage_analysis) at 2020-10-09 04:47:46 UTC with arguments: #
<GlobalID:0x000055a832b56848 @uri=#<URI::GID gid://trace-taiwan/ActiveStorage::Blob/268>>

2020-10-09T04:47:28.918128+00:00 app[web.1]: I, [2020-10-09T04:47:28.918053 #9]  INFO -- : 
Retrying ActiveStorage::AnalyzeJob in 18 seconds, due to a ActiveStorage::IntegrityError.
2020-10-09T04:47:28.917859+00:00应用程序[web.1]:I[2020-10-09T04:47:28.917748]信息--:
[ActiveJob]排队的ActiveStorage::AnalyzeJob(作业ID:09e91b28-ee03-48e8-b04f-7120a06910b8)
要在2020-10-09 04:47:46 UTC与参数异步(活动存储分析):#
2020-10-09T04:47:28.918128+00:00应用程序[web.1]:I[2020-10-09T04:47:28.918053#9]信息--:
由于ActiveStorage::IntegrityError,正在18秒内重试ActiveStorage::AnalyzeJob。
这会在18秒、80秒、256秒之后重复,以此类推。除了这个错误,一切都正常。照片在开发和生产过程中都是通过应用程序上传、调整大小和显示的,但我不希望每次上传都像这样不断地运行和失败。同样,如果我不调整照片的大小,这会消失,但是由于照片的数量,我将允许用户上传,而且我的存储空间有限,这对我来说不是一个好的选择


有没有办法让ActiveStorage知道照片已经并且应该调整大小,或者有没有办法让此检查立即运行或根本不运行?

因此,在广泛搜索后,用于创建完整性检查校验和的部分信息是图像的“字节大小”

校验和首先在将图像传递给Cloudinary之前创建,然后在成功保存图像之后创建。由于在Cloudinary上对传入图像进行的服务端图像处理会在保存图像之前调整它们的大小,因此实际上没有办法做到这一点

作为一种解决方法,我所做的是创建一个后台工作,我可以在帖子创建后调用它

require 'tmpdir'
require 'fileutils'
require 'open-uri'
class ResizeImagesJob < ApplicationJob
  queue_as :default

  def perform(post)
    post.images.each do |image|
      blob = image.blob
      blob.open do |temp_file|
        path = temp_file.path
        pipeline = ImageProcessing::MiniMagick.source(path)
        .resize_to_limit(1200, 1200)
        .call(destination: path)
        new_data = File.binread(path)
        post.send(:images).attach io: StringIO.new(new_data), filename: blob.filename.to_s, 
                           content_type: 'image'
      end
      image.purge_later
    end
  end
end
这样做的目的是像平常一样将照片上传到Cloudinary,这样用户就不会像我自己调整大小那样等待。在我更改照片之前,等待2秒以允许进行完整性检查。然后,它从Cloudinary重新下载照片,重新调整大小,将新调整大小的照片附加到帖子,并删除旧照片,所有这些都在后台进行


显然,这并不理想,但它是有效的。非常高兴听到更好的解决方案。

因此,经过广泛搜索后,用于创建完整性检查校验和的部分信息是图像的“字节大小”

校验和首先在将图像传递给Cloudinary之前创建,然后在成功保存图像之后创建。由于在Cloudinary上对传入图像进行的服务端图像处理会在保存图像之前调整它们的大小,因此实际上没有办法做到这一点

作为一种解决方法,我所做的是创建一个后台工作,我可以在帖子创建后调用它

require 'tmpdir'
require 'fileutils'
require 'open-uri'
class ResizeImagesJob < ApplicationJob
  queue_as :default

  def perform(post)
    post.images.each do |image|
      blob = image.blob
      blob.open do |temp_file|
        path = temp_file.path
        pipeline = ImageProcessing::MiniMagick.source(path)
        .resize_to_limit(1200, 1200)
        .call(destination: path)
        new_data = File.binread(path)
        post.send(:images).attach io: StringIO.new(new_data), filename: blob.filename.to_s, 
                           content_type: 'image'
      end
      image.purge_later
    end
  end
end
这样做的目的是像平常一样将照片上传到Cloudinary,这样用户就不会像我自己调整大小那样等待。在我更改照片之前,等待2秒以允许进行完整性检查。然后,它从Cloudinary重新下载照片,重新调整大小,将新调整大小的照片附加到帖子,并删除旧照片,所有这些都在后台进行


显然,这并不理想,但它是有效的。非常高兴听到更好的解决方案。

在保存之前,我在
中使用了它,并使用以下代码钩住它

类事物

它可以工作,但我觉得有点不舒服,因为使用了一个未记录的Rails方法,并且假设
attachment\u改变了['pictures']。attachables
的顺序与
pictures

完全相同,我在保存
之前在
钩子中使用了以下代码

类事物