#!/usr/bin/env python3 """ 演示文件哈希原理和还原功能的脚本 """ import hashlib import requests import os # API基础URL BASE_URL = "http://localhost:8000/api/v1" USER_ID = 8 def calculate_sha256_hash(file_content: bytes) -> str: """计算文件的SHA-256哈希值""" return hashlib.sha256(file_content).hexdigest() def upload_test_file_with_hash(): """上传测试文件并展示哈希计算过程""" # 创建测试文件内容 original_content = "Hello World! 这是演示文件哈希的测试内容。\n包含中文和English混合内容。" print(f"📄 原始文件内容:") print(f"'{original_content}'") print(f"📏 文件大小: {len(original_content.encode('utf-8'))} bytes") print() # 计算哈希值 file_hash = calculate_sha256_hash(original_content.encode('utf-8')) print(f"🔒 计算SHA-256哈希值:") print(f"{file_hash}") print() # 上传文件 try: files = { "file": ("demo_hash_test.txt", original_content.encode('utf-8'), "text/plain") } data = { "user_id": USER_ID, "description": "演示文件哈希功能", "tags": "demo,hash,test", "is_public": "false" } response = requests.post( f"{BASE_URL}/files/upload", files=files, data=data ) if response.status_code == 201: result = response.json() if result.get("success"): file_info = result["data"]["file"] server_hash = file_info["file_hash"] file_id = file_info["id"] print(f"✅ 文件上传成功!") print(f"📋 文件ID: {file_id}") print(f"📁 服务器存储的文件名: {file_info['filename']}") print(f"🔒 服务器计算的哈希值: {server_hash}") print() # 验证哈希值一致性 if file_hash == server_hash: print(f"✅ 哈希值验证通过! 客户端和服务器计算结果一致") else: print(f"❌ 哈希值验证失败! 客户端和服务器计算结果不一致") print(f" 客户端: {file_hash}") print(f" 服务器: {server_hash}") return file_id, original_content, file_hash else: print(f"❌ 上传失败: {response.text}") return None, None, None except Exception as e: print(f"❌ 上传出错: {e}") return None, None, None def download_and_verify_file(file_id: int, original_content: str, original_hash: str): """下载文件并验证完整性""" print(f"\n📥 开始下载和验证文件...") try: # 下载文件 data = { "user_id": USER_ID, "file_id": file_id } response = requests.post( f"{BASE_URL}/files/download", json=data ) if response.status_code == 200: downloaded_content = response.content.decode('utf-8') print(f"📄 下载的文件内容:") print(f"'{downloaded_content}'") print() # 验证内容完整性 if downloaded_content == original_content: print(f"✅ 文件内容完整性验证通过!") else: print(f"❌ 文件内容完整性验证失败!") print(f" 原始内容: '{original_content}'") print(f" 下载内容: '{downloaded_content}'") # 计算下载文件的哈希值 downloaded_hash = calculate_sha256_hash(downloaded_content.encode('utf-8')) print(f"🔒 下载文件的哈希值:") print(f"{downloaded_hash}") print() # 验证哈希值 if downloaded_hash == original_hash: print(f"✅ 下载文件哈希验证通过! 文件完整性得到保证") else: print(f"❌ 下载文件哈希验证失败! 文件可能已损坏") print(f" 原始哈希: {original_hash}") print(f" 下载哈希: {downloaded_hash}") else: print(f"❌ 下载失败: {response.text}") except Exception as e: print(f"❌ 下载过程出错: {e}") def demonstrate_file_duplication(): """演示文件去重功能""" print(f"\n🔄 演示文件去重功能...") print(f"尝试上传相同内容的文件,系统应该拒绝重复上传...") # 创建与之前相同内容的文件 duplicate_content = "Hello World! 这是演示文件哈希的测试内容。\n包含中文和English混合内容。" try: files = { "file": ("duplicate_file.txt", duplicate_content.encode('utf-8'), "text/plain") } data = { "user_id": USER_ID, "description": "重复文件测试", "tags": "duplicate,test", "is_public": "false" } response = requests.post( f"{BASE_URL}/files/upload", files=files, data=data ) if response.status_code == 409: # 409 Conflict 表示文件已存在 result = response.json() print(f"✅ 文件去重功能正常工作!") print(f"📋 系统检测到文件已存在,拒绝重复上传") print(f"📄 原始文件名: {result.get('detail', {}).get('filename', 'Unknown')}") elif response.status_code == 201: print(f"⚠️ 文件去重功能可能未正常工作,重复上传成功了") else: print(f"❌ 测试失败: {response.text}") except Exception as e: print(f"❌ 测试过程出错: {e}") def show_file_location_on_server(): """显示文件在服务器上的存储位置""" print(f"\n📁 文件在服务器上的存储位置:") print(f"后端上传目录: backend/uploads/") # 列出uploads目录中的文件 try: if os.path.exists("backend/uploads"): files = os.listdir("backend/uploads") if files: print(f"当前存储的文件:") for file in files: file_path = os.path.join("backend/uploads", file) file_size = os.path.getsize(file_path) print(f" 📄 {file} ({file_size} bytes)") # 计算并显示文件的哈希值 with open(file_path, 'rb') as f: content = f.read() file_hash = calculate_sha256_hash(content) print(f" 🔒 SHA-256: {file_hash}") else: print(f" (目录为空)") else: print(f" (uploads目录不存在)") except Exception as e: print(f" 无法读取目录: {e}") if __name__ == "__main__": print("🔐 文件哈希原理演示") print("=" * 50) # 1. 上传测试文件 file_id, original_content, original_hash = upload_test_file_with_hash() if file_id: # 2. 下载并验证文件 download_and_verify_file(file_id, original_content, original_hash) # 3. 演示文件去重 demonstrate_file_duplication() # 4. 显示文件存储位置 show_file_location_on_server() print(f"\n🎉 演示完成!") print(f"📚 关键知识点:") print(f" • SHA-256哈希值用于验证文件完整性") print(f" • 相同内容的文件具有相同的哈希值") print(f" • 系统通过哈希值检测重复文件") print(f" • 文件在上传、存储、下载过程中保持完整性") else: print(f"\n❌ 演示失败,无法上传测试文件")