【发布时间】:2011-06-21 10:45:21
【问题描述】:
我正在 Ruby on Rails 中生成上传图像的校验和 (sha256)。
upload = params[:file]
data1 = upload.read
data2 = File.read(upload.tempfile)
checksum1 = Digest::SHA256.hexdigest(data1)
checksum2 = Digest::SHA256.hexdigest(data2)
puts checksum1
puts checksum2
最后两个语句返回不同的值。 checksum1 是通过使用 UploadedFile 对象读取数据生成的。 checksum2 是通过从文件系统中读取临时文件生成的。
ActionDispatch::Http::UploadedFile 的对象是否返回上传文件的内容以外的任何内容?当我生成写入文件系统的上传文件的校验和时,它与 checksum2 (temporary file checksum) 匹配,而不是与 checksum1 (UploadedFile.read) 匹配。
我假设通过从文件系统读取临时文件生成的校验和更可靠,因为对象 (UploadedFile) 实现可能会发生变化。如果需要,生成文件系统上现有文件的校验和会更容易。
那么,校验和不同的原因是什么,哪个更可靠?
谢谢。
更新 1: 根据@pablo-castellazzi 的建议,我使用 Digest::SHA256.file(upload.path).hexdigest 生成了哈希。让我们称之为校验和3
这个校验和3等于校验和1,但不同于校验和2
更新2:如果我使用@Arsen7 提到的二进制模式读取文件,那么所有校验和都是相等的。
【问题讨论】:
-
为了将来参考,获取文件校验和的更好方法是
Digest::SHA256.file(path_to_file).hexdigest。使用 File.read 可能会导致内存不足错误。
标签: ruby-on-rails windows file-upload checksum sha256