217 lines
7.1 KiB
Python
217 lines
7.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
调试文件下载接口的脚本
|
|
"""
|
|
|
|
import requests
|
|
import mysql.connector
|
|
import os
|
|
import json
|
|
|
|
# API基础URL
|
|
BASE_URL = "http://localhost:8000/api/v1"
|
|
|
|
def debug_download_issue():
|
|
"""调试下载接口问题"""
|
|
|
|
print("=== 调试文件下载接口 ===")
|
|
|
|
# 检查数据库中的文件信息
|
|
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,
|
|
file_hash, mime_type, created_at
|
|
FROM files
|
|
ORDER BY id
|
|
""")
|
|
files = cursor.fetchall()
|
|
|
|
print("数据库中的文件记录:")
|
|
for file in files:
|
|
(id, user_id, original_filename, filename, file_path,
|
|
file_size, file_hash, mime_type, created_at) = file
|
|
print(f"ID: {id}, 用户ID: {user_id}, 文件名: {original_filename}")
|
|
print(f" 存储路径: {file_path}")
|
|
print(f" 文件大小: {file_size} bytes")
|
|
print(f" 创建时间: {created_at}")
|
|
print("-" * 50)
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
|
|
except Exception as e:
|
|
print(f"数据库查询出错: {e}")
|
|
return
|
|
|
|
# 测试特定文件下载
|
|
test_cases = [
|
|
{"user_id": 3, "file_id": 2, "description": "用户3下载文件2(axurerp-48.png)"},
|
|
{"user_id": 3, "file_id": 3, "description": "用户3下载文件3(axurerp-128.png)"},
|
|
{"user_id": 8, "file_id": 4, "description": "用户8下载文件4(hash_demo.txt)"},
|
|
{"user_id": 3, "file_id": 4, "description": "用户3下载文件4(权限测试)"},
|
|
{"user_id": 1, "file_id": 2, "description": "用户1下载文件2(不存在用户)"},
|
|
{"user_id": 3, "file_id": 999, "description": "用户3下载文件999(不存在文件)"},
|
|
]
|
|
|
|
for test_case in test_cases:
|
|
user_id = test_case["user_id"]
|
|
file_id = test_case["file_id"]
|
|
description = test_case["description"]
|
|
|
|
print(f"\n=== 测试: {description} ===")
|
|
print(f"入参: user_id={user_id}, file_id={file_id}")
|
|
|
|
try:
|
|
data = {
|
|
"user_id": user_id,
|
|
"file_id": file_id
|
|
}
|
|
|
|
response = requests.post(
|
|
f"{BASE_URL}/files/download",
|
|
json=data
|
|
)
|
|
|
|
print(f"HTTP状态码: {response.status_code}")
|
|
|
|
if response.status_code == 200:
|
|
# 下载成功
|
|
content_length = len(response.content)
|
|
print(f"下载成功! 文件大小: {content_length} bytes")
|
|
|
|
# 保存下载的文件用于检查
|
|
save_filename = f"downloaded_user{user_id}_file{file_id}"
|
|
if content_length > 0:
|
|
with open(save_filename, 'wb') as f:
|
|
f.write(response.content)
|
|
print(f"文件已保存为: {save_filename}")
|
|
else:
|
|
print("警告: 下载的文件为空")
|
|
|
|
# 显示内容预览
|
|
try:
|
|
if response.headers.get('content-type', '').startswith('text/'):
|
|
text_content = response.content.decode('utf-8')
|
|
preview = text_content[:100] + "..." if len(text_content) > 100 else text_content
|
|
print(f"内容预览: {preview}")
|
|
else:
|
|
print("二进制文件,无法预览内容")
|
|
except:
|
|
print("无法预览文件内容")
|
|
|
|
else:
|
|
# 下载失败
|
|
print(f"下载失败!")
|
|
print(f"响应内容: {response.text}")
|
|
|
|
# 尝试解析JSON错误信息
|
|
try:
|
|
error_data = response.json()
|
|
print(f"错误详情: {json.dumps(error_data, indent=2, ensure_ascii=False)}")
|
|
except:
|
|
print("无法解析错误响应")
|
|
|
|
except Exception as e:
|
|
print(f"请求出错: {e}")
|
|
|
|
def check_file_access_permission():
|
|
"""检查文件访问权限"""
|
|
|
|
print("\n=== 检查文件访问权限 ===")
|
|
|
|
# 检查uploads目录权限
|
|
uploads_dir = "uploads"
|
|
if os.path.exists(uploads_dir):
|
|
print(f"uploads目录存在: {os.path.abspath(uploads_dir)}")
|
|
|
|
# 检查目录权限
|
|
try:
|
|
test_file = os.path.join(uploads_dir, "test_permission.txt")
|
|
with open(test_file, 'w') as f:
|
|
f.write("test")
|
|
|
|
if os.path.exists(test_file):
|
|
os.remove(test_file)
|
|
print("uploads目录读写权限正常")
|
|
else:
|
|
print("uploads目录权限异常")
|
|
except Exception as e:
|
|
print(f"无法在uploads目录写入文件: {e}")
|
|
else:
|
|
print("uploads目录不存在")
|
|
|
|
# 检查数据库文件记录与实际文件的对应关系
|
|
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, filename, file_path FROM files ORDER BY id")
|
|
files = cursor.fetchall()
|
|
|
|
print("\n文件记录与实际文件对应关系:")
|
|
for (id, user_id, filename, file_path) in files:
|
|
full_path = os.path.join("uploads", filename)
|
|
exists = os.path.exists(full_path)
|
|
if exists:
|
|
size = os.path.getsize(full_path)
|
|
print(f"ID {id}: 文件存在 ({size} bytes)")
|
|
else:
|
|
print(f"ID {id}: 文件不存在 - {full_path}")
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
|
|
except Exception as e:
|
|
print(f"检查文件对应关系出错: {e}")
|
|
|
|
def test_download_with_curl():
|
|
"""使用curl测试下载接口"""
|
|
|
|
print("\n=== 使用curl测试下载接口 ===")
|
|
|
|
test_cases = [
|
|
{"user_id": 3, "file_id": 2},
|
|
{"user_id": 3, "file_id": 3},
|
|
]
|
|
|
|
for test_case in test_cases:
|
|
user_id = test_case["user_id"]
|
|
file_id = test_case["file_id"]
|
|
|
|
print(f"\n测试 curl - 用户ID: {user_id}, 文件ID: {file_id}")
|
|
|
|
curl_command = f'''curl -X POST "{BASE_URL}/files/download" \\
|
|
-H "Content-Type: application/json" \\
|
|
-d '{{"user_id": {user_id}, "file_id": {file_id}}}' \\
|
|
-v'''
|
|
|
|
print("命令:")
|
|
print(curl_command)
|
|
print("(请在终端中手动执行此命令)")
|
|
|
|
if __name__ == "__main__":
|
|
debug_download_issue()
|
|
check_file_access_permission()
|
|
test_download_with_curl()
|
|
|
|
print("\n=== 调试总结 ===")
|
|
print("如果下载失败,可能的原因:")
|
|
print("1. 文件不存在或已被删除")
|
|
print("2. 用户ID与文件不匹配")
|
|
print("3. uploads目录权限问题")
|
|
print("4. 实际文件大小为0字节")
|
|
print("5. 下载接口实现逻辑问题") |