文件实现秒传 读取加密返回

使用场景解析

  • 文件(图片)首次上传 记录该文件内容加密
  • 文件(图片)第二次上传 查询记录里面是否存在改加密数据 存在则直接返回 否则保存后 返回

Python实现方式

  • 脚本方式, 稍微修改逻辑 即可实现web上传方式

导入使用的包

1
2
3
4
import os
import hashlib
import time
import random

创建记录值

1
hash_file_dic = dict()  # 记录文件是否存在

创建一个初始化记录文件读取加密等待对比的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def InitFileReadMd5Store():
"""
计算模拟库中的所有文件的MD
记录指定文件夹下的所有文件读取加密后的结果
Returns: {"file_name": "md5 value"}
"""
store_path = os.getcwd() + r"\files"
print(store_path)
all_file_list = os.listdir(store_path)
for file in all_file_list:
tmp_path = os.path.join(store_path, file)
md5Obj = hashlib.md5() # 创建一个md5算法对象
with open(tmp_path, 'rb') as f:
while 1:
data = f.read(1024)
if data:
md5Obj.update(data)
else:
break
hash_file_dic[file] = md5Obj.hexdigest()

创建一个读取上传文件加密的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def CalcUploadFileHashMd5(filePath):
"""
计算待上传文件的MD值
Args: filePath: /xxx/xxx/xxx.xxx
Returns: True / False
"""
bytes_ = 1024
md5Obj = hashlib.md5()
try:
with open(filePath, 'rb') as f:
while 1:
data = f.read(bytes_)
if data:
md5Obj.update(data)
else:
break
except:
print("查无此文件 请检查...")
ret = md5Obj.hexdigest()
file_name = filePath.split('/')[-1]
if file_name in hash_file_dic.keys():
if hash_file_dic[file_name] == ret:
return True
else:
return False
else:
return False

测试运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if __name__ == '__main__':
InitFileReadMd5Store()
# C:/Users/Administrator/Desktop/demo/df/Demo.java
while True:
file_path = input('请输入要上传的文件路径(q退出)\n')
if file_path == 'Q' or file_path == 'q':
break
is_has = CalcUploadFileHashMd5(file_path)
if is_has:
print('文件已存在(秒传) 返回该文件的内容')
else:
print('请稍等,正在模拟网络上传文件')
time.sleep(random.randrange(3, 8))
print('文件上传成功!')
print('*' * 50)
print('程序退出')