如何创建carrierwave上传校验和以验证下载?

时间:2015-07-20 18:45:19

标签: ruby-on-rails carrierwave

当我上传文件时,如何创建文件的校验和(MD5,sha512,无论如何),这样当我下载(使用cache_stored_file!)时,我可以验证它确实是原始文件上传?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

  

md5 = Digest :: MD5.file('path_to_file')。hexdigest

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

用于SHA校验和

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

OR

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

SHA校验和生成的更多详细信息SHA Checksum