base64_decode_task.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import logging
  2. import os
  3. import time
  4. from typing import Any
  5. from app.service.task.base_task import BaseTask
  6. from app.service.task.task_param import TaskParam
  7. from app.service.task.task_result import TaskResult
  8. from app.util.file_util import generate_unique_filename, base64_to_file
  9. logger = logging.getLogger(__name__)
  10. class Base64DecodeTask(BaseTask):
  11. def get_type(self) -> str:
  12. return "base64_decode"
  13. def execute(self, param: TaskParam) -> TaskResult:
  14. try:
  15. files_obj = param.inputs.get("files")
  16. files: list[str] = files_obj if isinstance(files_obj, list) else []
  17. if not files:
  18. logger.warning("[base64_decode] No files provided, waiting for workflow engine fallback")
  19. return TaskResult.failure("No files provided for base64 decoding")
  20. if not param.workspace:
  21. return TaskResult.failure("Workspace path is not provided")
  22. logger.info("[base64_decode] Starting: %d files to decode", len(files))
  23. t0 = time.time()
  24. decoded_files: list[str] = []
  25. for i, b64 in enumerate(files):
  26. try:
  27. name = generate_unique_filename(".png")
  28. rel_path = os.path.join(param.step_id, name)
  29. abs_path = os.path.join(param.workspace, rel_path)
  30. base64_to_file(b64, abs_path)
  31. decoded_files.append(rel_path)
  32. logger.info("[base64_decode] Decoded file %d/%d -> %s (base64_len=%d)",
  33. i + 1, len(files), rel_path, len(b64))
  34. except Exception as e:
  35. logger.error("[base64_decode] Failed to decode file %d/%d: %s", i + 1, len(files), e)
  36. if not decoded_files:
  37. return TaskResult.failure("No files were successfully decoded")
  38. logger.info("[base64_decode] Completed: %d/%d decoded in %.2fs",
  39. len(decoded_files), len(files), time.time() - t0)
  40. return TaskResult.success({"files": decoded_files})
  41. except Exception as e:
  42. logger.error("[base64_decode] Error: %s", e, exc_info=True)
  43. return TaskResult.failure(f"Base64 decoding failed: {e}")