Files
full-stack-doc/backend/debug_upload_steps.py
2025-10-14 20:05:29 +08:00

126 lines
4.5 KiB
Python

#!/usr/bin/env python3
"""
逐步调试文件上传过程的每个步骤
"""
import requests
import io
import os
def debug_upload_step_by_step():
"""逐步调试上传过程"""
print("=== 步骤1: 准备测试文件 ===")
test_content = b"Debug upload content - step by step analysis"
print(f"原始内容大小: {len(test_content)} bytes")
print(f"原始内容: {test_content}")
print()
print("=== 步骤2: 创建模拟上传文件 ===")
file_obj = io.BytesIO(test_content)
file_obj.seek(0)
print(f"BytesIO对象创建成功")
print(f"当前位置: {file_obj.tell()}")
print()
print("=== 步骤3: 准备请求数据 ===")
files = {
'file': ('debug_step_test.txt', file_obj, 'text/plain')
}
data = {
'user_id': 3,
'description': 'Step by step debug test',
'tags': 'debug,step',
'is_public': 'false'
}
print("请求数据准备完成")
print()
print("=== 步骤4: 发送上传请求 ===")
try:
response = requests.post('http://localhost:8000/api/v1/files/upload', files=files, data=data)
print(f"响应状态码: {response.status_code}")
print(f"响应头: {dict(response.headers)}")
if response.status_code == 201:
result = response.json()
print("=== 步骤5: 上传成功分析 ===")
if result.get('success'):
file_info = result['data']['file']
file_id = file_info['id']
filename = file_info['filename']
db_size = file_info['file_size']
print(f"数据库记录:")
print(f" 文件ID: {file_id}")
print(f" 存储文件名: {filename}")
print(f" 数据库大小: {db_size} bytes")
print(f" 预期大小: {len(test_content)} bytes")
# 检查磁盘文件
print("\n=== 步骤6: 磁盘文件分析 ===")
file_path = os.path.join('uploads', filename)
print(f"预期路径: {file_path}")
if os.path.exists(file_path):
actual_size = os.path.getsize(file_path)
print(f"实际文件大小: {actual_size} bytes")
if actual_size == 0:
print("❌ 文件损坏: 大小为0")
elif actual_size == len(test_content):
print("✅ 文件完整")
# 验证内容
with open(file_path, 'rb') as f:
actual_content = f.read()
if actual_content == test_content:
print("✅ 内容完全匹配")
else:
print("❌ 内容不匹配")
print(f"预期: {test_content}")
print(f"实际: {actual_content}")
else:
print(f"⚠️ 大小不匹配: {actual_size} != {len(test_content)}")
# 读取部分内容检查
try:
with open(file_path, 'rb') as f:
actual_content = f.read(min(100, actual_size))
print(f"实际内容预览: {actual_content}")
except Exception as e:
print(f"无法读取文件内容: {e}")
else:
print("❌ 文件不存在于磁盘")
# 检查目录
upload_dir = 'uploads'
if os.path.exists(upload_dir):
print(f"uploads目录存在")
files_in_dir = os.listdir(upload_dir)
print(f"目录中的文件: {files_in_dir}")
else:
print("uploads目录不存在")
else:
print("上传返回失败:", result)
else:
print("=== 步骤5: 上传失败分析 ===")
print(f"HTTP状态码: {response.status_code}")
print(f"响应内容: {response.text}")
# 尝试解析错误
try:
error_data = response.json()
print(f"错误详情: {error_data}")
except:
print("无法解析错误响应")
except Exception as e:
print(f"请求异常: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
debug_upload_step_by_step()