【问题标题】:Rails active_storage: Check if an attachment is the same as a given fileRails active_storage:检查附件是否与给定文件相同
【发布时间】:2023-04-02 06:55:01
【问题描述】:

鉴于以下情况:

  • 通过文件传输新收到的 PDF 类型的文档 source
  • 使用 active_storage 和版本化保存为附件 blob 的文档 target

我想检查target 的任何现有版本是否二进制等于source。如果没有active_storage,我会对进入数据库的任何 blob 进行 SHA256 和。为了进行比较,我将source 的新SHA256 总和与为任何版本的target 存储的每个校验和进行比较。

但是,active_storage 附件和 blob 的方法 .checksum 似乎既不是 MD5 也不是 SHA265 总和。例如,我为某些文件获得 Cr4IxYNF7v7cJao1EiiBEw==

解决方案是使用 Digest::SHA256.hexdigest(Person.find(46).photo.download) 之类的东西,但性能会很糟糕。

如何有效地搜索我的active_storage“数据库”?

【问题讨论】:

    标签: ruby-on-rails ruby checksum rails-activestorage


    【解决方案1】:

    根据 ActiveStorage 来源,校验和实际上是 MD5。但它是经过base64编码的。

    来源:https://github.com/rails/rails/blob/8da6ba9cae21beae1ee3c379db7b7113d2731c9b/activestorage/app/models/active_storage/blob.rb#L313

    def compute_checksum_in_chunks(io)
      Digest::MD5.new.tap do |checksum|
        while chunk = io.read(5.megabytes)
          checksum << chunk
        end
    
        io.rewind
      end.base64digest
    end
    

    所以希望您应该能够只对自己的 MD5 哈希进行 base64 编码,以便在数据库中进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2022-01-01
      • 2020-04-30
      相关资源
      最近更新 更多