file_utils.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. """
  2. 文件处理工具模块
  3. 提供文件操作相关的功能
  4. """
  5. import os
  6. import time
  7. import datetime
  8. import shutil
  9. from .logger import logger
  10. def get_date_folder(base_folder):
  11. """
  12. 获取当前日期对应的文件夹路径,如果不存在则创建
  13. 参数:
  14. base_folder: 基础文件夹路径
  15. 返回:
  16. str: 日期文件夹路径
  17. """
  18. today = datetime.datetime.now().strftime('%Y-%m-%d')
  19. date_folder = os.path.join(base_folder, today)
  20. os.makedirs(date_folder, exist_ok=True)
  21. return date_folder
  22. def get_safe_filename(base_name, extension):
  23. """
  24. 生成一个带时间戳的安全文件名,避免文件名冲突
  25. 参数:
  26. base_name: 原始文件名基础部分
  27. extension: 文件扩展名
  28. 返回:
  29. str: 安全的文件名
  30. """
  31. timestamp = int(time.time())
  32. return f"{base_name}_{timestamp}{extension}"
  33. def clean_old_files(output_folder):
  34. """
  35. 清理前一天的输出文件
  36. 每天凌晨2点自动运行
  37. 参数:
  38. output_folder: 输出文件根目录
  39. """
  40. logger.info("开始执行文件清理任务")
  41. try:
  42. # 获取前一天的日期
  43. yesterday = (datetime.datetime.now() - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
  44. yesterday_folder = os.path.join(output_folder, yesterday)
  45. # 如果文件夹存在,则删除
  46. if os.path.exists(yesterday_folder) and os.path.isdir(yesterday_folder):
  47. # 记录删除前的文件数量和大小
  48. files_count = 0
  49. total_size = 0
  50. for root, dirs, files in os.walk(yesterday_folder):
  51. files_count += len(files)
  52. for f in files:
  53. file_path = os.path.join(root, f)
  54. total_size += os.path.getsize(file_path)
  55. # 删除文件夹
  56. shutil.rmtree(yesterday_folder)
  57. logger.info(f"已清理前一天({yesterday})的输出文件夹,共删除 {files_count} 个文件,总大小 {total_size/1024/1024:.2f} MB")
  58. else:
  59. logger.info(f"前一天({yesterday})的输出文件夹不存在,无需清理")
  60. except Exception as e:
  61. logger.error(f"清理文件时出错: {str(e)}", exc_info=True)
  62. def allowed_file(file, allowed_extensions):
  63. """
  64. 检查上传的文件是否为允许的类型
  65. 参数:
  66. file: 上传的文件对象
  67. allowed_extensions: 允许的文件扩展名集合
  68. 返回:
  69. bool: 文件类型是否允许
  70. """
  71. # 检查文件扩展名
  72. extension = os.path.splitext(file.filename)[1].lower() if file.filename else ''
  73. if extension not in allowed_extensions:
  74. return False
  75. # 检查MIME类型
  76. content_type = file.content_type
  77. allowed_mime_types = {
  78. 'application/msword', # .doc
  79. 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' # .docx
  80. }
  81. return content_type in allowed_mime_types