API表单文件处理异常:不同输入文件生成相同临时文件哈希
问题分析与解决方案
看起来你遇到的核心问题是:不管上传什么文件,生成的哈希值都一模一样。我帮你梳理几个最可能的原因,以及对应的修复方法:
1. 哈希计算的是文件名而非文件内容
从你给出的代码片段看,add_doc函数传入了两次orig_filename——如果这个函数是用文件名来生成哈希,而不是读取文件的实际内容,那不管传什么文件,只要文件名相同(或者你每次测试用的文件名刚好重复),哈希自然就会完全一致。
修复思路:
你需要确保哈希算法是读取上传文件的二进制内容,而不是依赖文件名。比如在计算哈希前,先读取document对象的内容:
def gen_hash(): import hashlib for attr, document in request.files.iteritems(): orig_filename = document.filename # 读取文件内容前先重置指针(防止之前读取过导致内容为空) document.seek(0) file_content = document.read() # 以SHA256为例计算哈希 mhash = hashlib.sha256(file_content).hexdigest() # 后续处理用实际哈希值,而非文件名 new_doc = add_doc(orig_filename, mhash)
2. 临时文件没有正确写入上传内容
如果add_doc是负责创建临时文件,但内部没有把上传的文件内容写入进去,只是生成了空文件,那所有空文件的哈希值肯定是完全相同的。
修复思路:
检查add_doc函数内部,确保正确将上传文件的内容写入临时文件:
def add_doc(filename, hash_val): import tempfile with tempfile.NamedTemporaryFile(delete=False) as tmp_file: # 这里要传入上传的文件对象,写入其内容 document.seek(0) tmp_file.write(document.read()) # 之后基于写入后的临时文件内容计算哈希
3. 哈希计算逻辑未正确执行
你代码里有一行#mhash = None,后面的哈希算法部分被截断了——如果实际代码中哈希计算的逻辑被注释掉,或者始终返回某个固定值,那结果自然会重复。
修复思路:
确保哈希计算的代码块被正确执行,并且确实基于文件内容生成。比如处理大文件时用分块读取的方式,避免内存溢出:
def gen_hash(): import hashlib for attr, document in request.files.iteritems(): orig_filename = document.filename mhash = hashlib.md5() # 分块读取文件内容,更新哈希 document.seek(0) while chunk := document.read(4096): mhash.update(chunk) final_hash = mhash.hexdigest() new_doc = add_doc(orig_filename, final_hash)
4. 文件指针位置错误导致读取空内容
如果在计算哈希之前,已经读取过一次文件内容但没有重置指针,document.read()会返回空字符串,所有文件的哈希都会是空内容的哈希值。
修复思路:
在读取文件内容前,一定要调用document.seek(0)把文件指针重置到开头:
document.seek(0) # 重置指针到文件起始位置 file_content = document.read()
内容的提问来源于stack exchange,提问作者user956424




