Sri*_*isa 5 windows checksum file-upload ruby-on-rails sha256
我在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
Run Code Online (Sandbox Code Playgroud)
最后两个语句返回不同的值.checksum1是通过使用UploadedFile对象读取数据生成的.checksum2是通过从文件系统读取临时文件生成的.
ActionDispatch :: Http :: UploadedFile的对象是否返回比上传文件的内容更多的内容?当我生成写入文件系统的上传文件的校验和时,它与checksum2(临时文件校验和)匹配,而不是与checksum1(UploadedFile.read)匹配.
我假设通过从文件系统读取临时文件生成的校验和更可靠,因为对象(UploadedFile)实现可能会更改.如果需要,可以更轻松地生成文件系统上现有文件的校验和.
那么,校验和差异的原因是什么,哪一个更可靠?
谢谢.
更新1:根据@ pablo-castellazzi的建议,我使用Digest :: SHA256.file(upload.path).hexdigest生成哈希.我们称之为校验和3
checksum3等于checksum1但与checksum2不同
更新2:如果我使用二进制模式读取@ Arsen7提到的文件,那么所有校验和都是相同的.
您是否比较过“data1”和“data2”的内容?尝试将它们保存到文件中并查看。
我想,您可能想upload.rewind在第一次读取之前调用,但第一件事是查看从文件中读取的原始数据。
更新:
你没有说你是在Windows上。在这种情况下,您应该小心并以所谓的“二进制”模式读取文件。
将方法更改File.read为如下所示:
data2 = nil
File.open(upload.path, "rb") {|f| data2 = f.read }
Run Code Online (Sandbox Code Playgroud)
(实施Pablo Castellazzi建议的使用.path方法)
我建议您在一些二进制安全编辑器(例如 vim)中打开文件并比较不同之处。您会注意到,也许大多数数据是相同的,但其中一个文件的行结尾不同,或者您可能会发现一些其他差异。
对于 Windows,最常见的问题是二进制模式。
| 归档时间: |
|
| 查看次数: |
2390 次 |
| 最近记录: |