这是app.py代码
import os
import logging
import traceback
import time
import threading
from flask import Flask, render_template, request, redirect, url_for, send_from_directory, jsonify
from werkzeug.utils import secure_filename
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.config['MAX_CONTENT_LENGTH'] = 100 * 1024 * 1024 # 100MB
app.config['SECRET_KEY'] = 'your_strong_secret_key_here'
app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'] = '/shared/files' # 局域网文件共享目录
app.config['FILE_CLEANUP_INTERVAL'] = 3600 # 文件清理间隔(秒)
# 确保上传目录和共享目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
os.makedirs(app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'], exist_ok=True)
# 配置详细日志记录
logging.basicConfig(
filename='app.log',
level=logging.INFO,
format='[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
)
app.logger = logging.getLogger(__name__)
# 文件系统锁确保线程安全
file_lock = threading.Lock()
def cleanup_old_files():
"""定期清理临时上传目录中的旧文件"""
while True:
try:
with file_lock:
now = time.time()
for filename in os.listdir(app.config['UPLOAD_FOLDER']):
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
if os.path.isfile(file_path):
file_age = now - os.path.getctime(file_path)
if file_age > 24 * 3600: # 删除超过1天的临时文件
os.remove(file_path)
app.logger.info(f"Cleaned up old file: {filename}")
except Exception as e:
app.logger.error(f"File cleanup error: {str(e)}")
time.sleep(app.config['FILE_CLEANUP_INTERVAL'])
# 启动文件清理线程
cleanup_thread = threading.Thread(target=cleanup_old_files, daemon=True)
cleanup_thread.start()
@app.errorhandler(500)
def internal_error(error):
"""自定义500错误处理页面"""
app.logger.error(f"500 Error: {error}\n{traceback.format_exc()}")
return render_template('500.html', error=traceback.format_exc()), 500
@app.errorhandler(404)
def not_found_error(error):
"""自定义404错误处理页面"""
return render_template('404.html', error=error.description), 404
@app.route('/')
def index():
"""安全的主页路由,显示共享文件列表"""
try:
# 获取共享目录中的文件列表
files = []
with file_lock:
for filename in os.listdir(app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files']):
file_path = os.path.join(app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'], filename)
if os.path.isfile(file_path):
files.append({
'name': filename,
'size': os.path.getsize(file_path),
'modified': time.ctime(os.path.getmtime(file_path))
})
return render_template('index.html', files=files)
except Exception as e:
app.logger.error(f"Error in index route: {str(e)}")
return render_template('500.html', error=str(e)), 500
@app.route('/upload', methods=['POST'])
def upload_file():
"""安全的文件上传处理"""
try:
if 'file' not in request.files:
app.logger.warning("No file part in request")
return jsonify({'status': 'error', 'message': 'No file part'}), 400
file = request.files['file']
if file.filename == '':
app.logger.warning("No selected file")
return jsonify({'status': 'error', 'message': 'No selected file'}), 400
if file:
# 安全处理文件名
filename = secure_filename(file.filename)
file_path = os.path.join(app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'], filename)
# 保存文件到共享目录
with file_lock:
file.save(file_path)
app.logger.info(f"File uploaded: {filename}")
return jsonify({'status': 'success', 'filename': filename})
except Exception as e:
app.logger.error(f"Upload error: {str(e)}\n{traceback.format_exc()}")
return jsonify({'status': 'error', 'message': str(e)}), 500
@app.route('/download/<filename>')
def download_file(filename):
"""文件下载功能"""
try:
# 验证文件名是否安全
safe_filename = secure_filename(filename)
file_path = os.path.join(app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'], safe_filename)
# 检查文件是否存在
if not os.path.exists(file_path):
app.logger.warning(f"File not found: {safe_filename}")
return render_template('404.html', filename=safe_filename), 404
# 提供文件下载
return send_from_directory(
app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'],
safe_filename,
as_attachment=True
)
except Exception as e:
app.logger.error(f"Download error: {str(e)}\n{traceback.format_exc()}")
return render_template('500.html', error=str(e)), 500
@app.route('/delete/<filename>', methods=['POST'])
def delete_file(filename):
"""删除文件功能"""
try:
# 验证文件名是否安全
safe_filename = secure_filename(filename)
file_path = os.path.join(app.config['C:\\Users\21904\PycharmProjects\PythonProject\.venv\your_project\\uploads\shared\files'], safe_filename)
# 检查文件是否存在
if not os.path.exists(file_path):
app.logger.warning(f"File not found for deletion: {safe_filename}")
return jsonify({'status': 'error', 'message': 'File not found'}), 404
# 删除文件
with file_lock:
os.remove(file_path)
app.logger.info(f"File deleted: {safe_filename}")
return jsonify({'status': 'success', 'filename': safe_filename})
except Exception as e:
app.logger.error(f"Delete error: {str(e)}\n{traceback.format_exc()}")
return jsonify({'status': 'error', 'message': str(e)}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)