【问题标题】:How do I create a checksum of carrierwave upload to verify the download?如何创建载波上传的校验和以验证下载?
【发布时间】:2015-10-10 00:30:48
【问题描述】:

如何在上传文件时创建文件的校验和(MD5、sha512 等),以便在下载(使用cache_stored_file!)时验证它确实是上传的原始文件?

【问题讨论】:

  • @JakeWorth 不,这是其中的一部分,但我特别希望让carrierwave 获取文件的哈希,存储它,然后在用于发布时使用它来验证下载-处理文件。

标签: ruby-on-rails carrierwave


【解决方案1】:

Ruby Digest 模块可以帮助解决这个问题。

一种解决方案是在上传时读取文件并为其分配一个带有before_create 回调的唯一摘要。我会将其添加为数据库中文件表的列。

下面是 IRB 的一些输出,展示了它是如何工作的:

2.2.2 :001 > require 'digest'
 => true
2.2.2 :002 > f = File.read 'test.rb'
 => "Original content\n"
2.2.2 :003 > Digest::SHA256.hexdigest(f)
 => "646722e7ee99e28d618142b9d3a1bfcbe2196d8332ae632cc867ae5d1c8c57b5"

# (... file modified ...)

2.2.2 :004 > f = File.read 'test.rb'
 => "Original content with more content\n"
2.2.2 :005 > Digest::SHA256.hexdigest(f)
 => "c29f2f77c0777a78dbdf119bf0a58b470c098635dfc8279542e4c49d6f20e62c"

您可以在下载方法中使用此摘要来检查文件的完整性。如果您再次阅读该文件,生成一个摘要,并且它与原始摘要匹配,那么您可以确信该文件自上传以来没有被更改过。

Ruby Digest Module

【讨论】:

    【解决方案2】:

    md5 = 摘要::MD5.file('path_to_file').hexdigest

    这将读取块中的文件并避免读取 RAM 中的整个文件,这是在 File.read() 中完成的

    对于 SHA 校验和

    Digest::SHA2.hexdigest( File.read("/path/to/my/file.txt") );
    

    Digest::SHA2.file(myFile).hexdigest => "fa5880ac744f3c05c649a864739530ac387c8c8b0231a7d008c27f0f6a2753c7"

    更多关于 SHA 校验和生成的细节SHA Checksum

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      • 2014-01-10
      • 2011-11-23
      • 2013-01-25
      • 1970-01-01
      相关资源
      最近更新 更多