feat(公开内容): 添加临时文件上传功能,支持1小时/1天/7天过期

This commit is contained in:
xiaji
2026-05-25 21:08:56 +08:00
parent 3aa311b9da
commit ce7d39f36c
7 changed files with 328 additions and 87 deletions

View File

@@ -566,3 +566,58 @@ def celery_send_pdf_report_email(self):
'retries': self.request.retries if hasattr(self, 'request') else 0,
'timestamp': timezone.now().isoformat()
}
@shared_task(bind=True)
def cleanup_expired_temp_files(self):
"""
清理过期的临时文件
每小时执行一次,删除已过期的临时文件及其物理文件
"""
task_id = self.request.id if hasattr(self, 'request') else 'unknown'
logger.info(f"[任务 {task_id}] 开始执行清理过期临时文件任务")
try:
from core.models import PublicContent
expired_files = PublicContent.objects.filter(
is_temp_file=True,
expire_at__lte=timezone.now()
)
deleted_count = 0
for temp_file in expired_files:
try:
if temp_file.file:
file_path = temp_file.file.path
if os.path.exists(file_path):
os.remove(file_path)
logger.info(f"[任务 {task_id}] 已删除物理文件: {file_path}")
file_title = temp_file.title
temp_file.delete()
deleted_count += 1
logger.info(f"[任务 {task_id}] 已删除临时文件记录: {file_title}")
except Exception as e:
logger.error(f"[任务 {task_id}] 删除临时文件失败: {str(e)}")
logger.success(f"[任务 {task_id}] 清理完成,共删除 {deleted_count} 个过期临时文件")
return {
'status': 'success',
'task_id': task_id,
'deleted_count': deleted_count,
'timestamp': timezone.now().isoformat()
}
except Exception as e:
error_msg = str(e)
error_traceback = traceback.format_exc()
logger.error(f"[任务 {task_id}] 清理过期临时文件失败: {error_msg}")
logger.error(f"[任务 {task_id}] 错误详情:\n{error_traceback}")
return {
'status': 'failed',
'task_id': task_id,
'error': error_msg,
'timestamp': timezone.now().isoformat()
}