如何避免在ActiveStorage中接受损坏的图像?

我目前正在将Rails应用程序(用于驱动screenshots.debian.net)从Paperclip迁移到activeStorage。它允许用户上传PNG图片,然后显示给所有用户。

TL; DR:上传表单接受损坏的图像。 Imagemagick“接受”它们。 activeStorage不会立即对此进行验证。我最终在磁盘上损坏了文件。

这是图像的模型。我正在使用'active_storage_validations'gem:

class Screenshot < ApplicationRecord
  has_one_attached :image
  validates :image,attached: true,content_type: [:png]

  def medium_image
    if self.image.attached?
      self.image.variant(
        resize_to_limit: [670,600]
      ).processed
    end
  end
end

从具有文件字段的HTML表单接收上载的控制器逻辑:

def upload_receive
  @package = Package.find_by!(name: params[:name])
  params[:file].each do |img|
    new_screenshot = @package.screenshots.new(image: img)
    
    if new_screenshot.valid?  
      new_screenshot.save
    end
  end
end

这很好。接受PNG文件。 JPG文件被拒绝。很好。

但是,当我上传故意损坏的文件时,我遇到了麻烦。我创建了一个名为“ broken.png”的文件,该文件由5 KB的零字节组成。 activeStorage接受该文件,因此我得到的文件无效。

应该在上传后立即显示图像。调用Screenshot.medium_image方法,尝试创建变体。 ImageMagick尝试转换调整损坏图像的大小并失败:

convert /tmp/activeStorage-21670-… failed with error:
convert-im6.q16: improper image header `/tmp/activeStorage-21670-…' @ error/png.c/ReadPNGImage/4092.
convert-im6.q16: no images defined `/tmp/image_processing….png' @ error/convert.c/ConvertImageCommand/3258.

因此,一旦上传了如此破损的图像,应用程序将在每次尝试显示图像时失败。相当容易的拒绝服务。

我的理解:

  1. 文件被接受,然后“ .save”方法成功。损坏的文件刚刚保存到磁盘。
  2. 在此之后,activeStorage会启动后台作业来分析文件:[activeJob] Enqueued activeStorage::AnalyzeJob (Job ID: 91055878-f516-4f2f-98ff-e39573980b45) to Async(active_storage_analysis) with arguments
  3. 该作业运行并打印“由于ImageMagick不支持文件而跳过了图像分析”(来源:https://github.com/rails/rails/blob/fcb5f9035fd1307c300f4ab31fda353bd6365fc3/activestorage/lib/active_storage/analyzer/image_analyzer.rb#L39
  4. 作业将写入元数据并将文件标记为 identified analyzed activeStorage::Blob Update (1.0ms) UPDATE "active_storage_blobs" SET "metadata" = $1 WHERE "active_storage_blobs"."id" = $2 [["metadata","{\"identified\":true,\"analyzed\":true}"],["id",21670]]

我真正想要的是

  1. if new_screenshot.valid?行在文件上运行验证,发现文件已损坏。
  2. 不会发生“ .save”。错误消息将添加到flash消息中。

经过数小时的挫折,我很感谢任何提示。这是activeStorage或active_storage_validations gem中的错误吗?谢谢。

[我很想念回形针。 activeStorage似乎尚未提供相同的功能。]

zhouwei9993 回答:如何避免在ActiveStorage中接受损坏的图像?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1302938.html

大家都在问