我是Python的新手,所以我决定制作一个从服务器上下载一些文件的小项目。一切都很好,我决定通过生成MD5并与服务器的MD5进行比较来检查下载文件的完整性。问题是,它并不总是有效。有时使用某些文件可以生成正确的MD5,但大多数(约80%)生成的MD5与服务器不匹配。
我尝试了很多不同的例子,我可以找到生成MD5但是所有这些例子都会产生相同的结果。
注意:我正在以64kB块的形式读取文件,因为我有点资源限制(在Raspberry Pi上运行脚本),所以我认为这样做是个好主意。是的,我已经尝试一次加载文件 - 结果相同。
def md5_check(self, file_path, original_md5):
calculated_md5 = hashlib.md5()
with open(file_path, "rb") as file:
while True:
chunk = file.read(65536) #The downloaded file will be read in 64kB chunks
if not chunk: break
calculated_md5.update(chunk)
calculated_md5 = calculated_md5.hexdigest()
回答:
我在脚本中从我的项目中分离出代码,并将我的脚本提供的MD5与md5sum
的结果进行比较,结果是正确的。
正如Boann指出的那样,我检查了服务器的响应,看到服务器的MD5是正确还是坏了。服务器为文件提供了3个不同的URL,并计算了“未压缩”(原始)的MD5。由于其中一个URL标记为“original_file_url”,我认为它是原始文件的链接。事实并非如此。
为了帮助其他有类似问题的人,我将在此处留下我的孤立代码
import os
import urllib
import urllib.request
import hashlib
def save_file():
requester = urllib.request.Request("https://www.python.org/ftp/python/3.7.3/python-3.7.3.exe", headers={"User-Agent": "Mozilla/5.0"})
arquivo = urllib.request.urlopen(requester)
file_to_write = arquivo.read()
file_directory = "C:\\Users\\myuser\\Documents\\python-3.7.3.exe"
with open(file_directory, "wb") as file:
file.write(file_to_write)
md5_check(file_directory)
def md5_check(file_path):
calculated_md5 = hashlib.md5()
with open(file_path, "rb") as file:
while True:
chunk = file.read(65536)
if not chunk: break
calculated_md5.update(chunk)
calculated_md5 = calculated_md5.hexdigest()
print(calculated_md5)
save_file()
wait = input("")