#!/usr/bin/env python3 """ 详细调试下载接口的每个步骤 """ import requests import os import mysql.connector def debug_download_step_by_step(): """逐步调试下载过程""" print("=== 详细下载接口调试 ===") # 测试参数 user_id = 3 file_id = 22 print(f"测试参数: user_id={user_id}, file_id={file_id}") # 步骤1: 检查数据库中的文件记录 print("\n--- 步骤1: 检查数据库记录 ---") try: conn = mysql.connector.connect( host='101.126.85.76', user='mytest_db', password='mytest_db', database='mytest_db' ) cursor = conn.cursor() cursor.execute(''' SELECT id, user_id, original_filename, filename, file_path, file_size, mime_type FROM files WHERE id = %s AND user_id = %s ''', (file_id, user_id)) file_record = cursor.fetchone() if file_record: id, db_user_id, original_filename, filename, file_path, file_size, mime_type = file_record print(f"✅ 数据库记录找到:") print(f" 文件ID: {id}") print(f" 用户ID: {db_user_id}") print(f" 原始文件名: {original_filename}") print(f" 存储文件名: {filename}") print(f" 文件路径: {file_path}") print(f" 文件大小: {file_size} bytes") print(f" MIME类型: {mime_type}") else: print("❌ 数据库中没有找到匹配的记录") return cursor.close() conn.close() except Exception as e: print(f"❌ 数据库查询失败: {e}") return # 步骤2: 检查实际文件是否存在 print("\n--- 步骤2: 检查实际文件 ---") if os.path.exists(file_path): actual_size = os.path.getsize(file_path) print(f"✅ 文件存在:") print(f" 路径: {os.path.abspath(file_path)}") print(f" 实际大小: {actual_size} bytes") if actual_size == file_size: print("✅ 文件大小匹配数据库记录") else: print(f"⚠️ 文件大小不匹配: 数据库{file_size} vs 实际{actual_size}") # 检查文件可读性 if os.access(file_path, os.R_OK): print("✅ 文件可读") # 读取文件内容验证 try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() print(f"✅ 文件内容可读,长度: {len(content)} 字符") print(f" 内容预览: {content[:50]}...") except Exception as e: print(f"❌ 读取文件内容失败: {e}") else: print("❌ 文件不可读 - 权限问题") else: print(f"❌ 文件不存在: {file_path}") return # 步骤3: 测试API下载请求 print("\n--- 步骤3: 测试API下载请求 ---") try: download_data = {'user_id': user_id, 'file_id': file_id} print(f"发送请求: POST /api/v1/files/download") print(f"请求体: {download_data}") response = requests.post( 'http://localhost:8000/api/v1/files/download', json=download_data, timeout=10 ) print(f"响应状态码: {response.status_code}") print(f"响应头: {dict(response.headers)}") if response.status_code == 200: print("✅ 下载成功!") content_type = response.headers.get('content-type', '') content_length = len(response.content) print(f" 响应类型: {content_type}") print(f" 内容长度: {content_length} bytes") if content_type.startswith('text/'): text_content = response.text print(f" 文本内容长度: {len(text_content)} 字符") print(f" 文本内容预览: {text_content[:50]}...") # 验证内容 if len(text_content) == file_size / 2: # 大约UTF-8字符数 print("✅ 内容大小预期范围内") else: print(f"⚠️ 内容大小异常: 预期~{file_size//2}字符,实际{len(text_content)}字符") else: print(" 二进制内容,无法显示预览") else: print("❌ 下载失败!") print(f"错误响应: {response.text}") # 尝试解析JSON错误 try: error_data = response.json() print(f"错误详情: {error_data}") except: print("无法解析错误响应") except Exception as e: print(f"❌ API请求失败: {e}") import traceback traceback.print_exc() if __name__ == "__main__": debug_download_step_by_step()