Spaces:
Runtime error
Runtime error
| # -*- coding: utf-8 -*- | |
| """ File utils | |
| Use for managing generated files | |
| @file: file_utils.py | |
| @author: Konie | |
| @update: 2024-03-22 | |
| """ | |
| import base64 | |
| import datetime | |
| import shutil | |
| from io import BytesIO | |
| import os | |
| from pathlib import Path | |
| import numpy as np | |
| from PIL import Image | |
| from fooocusapi.utils.logger import logger | |
| output_dir = os.path.abspath(os.path.join( | |
| os.path.dirname(__file__), '../..', 'outputs', 'files')) | |
| os.makedirs(output_dir, exist_ok=True) | |
| STATIC_SERVER_BASE = 'http://127.0.0.1:8888/files/' | |
| def save_output_file( | |
| img: np.ndarray | str, | |
| image_name: str = '', | |
| extension: str = 'png') -> str: | |
| """ | |
| Save np image to file | |
| Args: | |
| img: np.ndarray image to save | |
| image_name: str of image name | |
| extension: str of image extension | |
| Returns: | |
| str of file name | |
| """ | |
| current_time = datetime.datetime.now() | |
| date_string = current_time.strftime("%Y-%m-%d") | |
| filename = os.path.join(date_string, image_name + '.' + extension) | |
| file_path = os.path.join(output_dir, filename) | |
| os.makedirs(os.path.dirname(file_path), exist_ok=True) | |
| try: | |
| if isinstance(img, str): | |
| shutil.move(img, file_path) | |
| return Path(file_path).as_posix() | |
| except Exception: | |
| raise Exception | |
| def delete_output_file(filename: str): | |
| """ | |
| Delete files specified in the output directory | |
| Args: | |
| filename: str of file name | |
| """ | |
| file_path = os.path.join(output_dir, filename) | |
| if not os.path.exists(file_path) or not os.path.isfile(file_path): | |
| logger.std_warn(f'[Fooocus API] {filename} not exists or is not a file') | |
| try: | |
| os.remove(file_path) | |
| logger.std_info(f'[Fooocus API] Delete output file: {filename}') | |
| return True | |
| except OSError: | |
| logger.std_error(f'[Fooocus API] Delete output file failed: {filename}') | |
| return False | |
| def output_file_to_base64img(filename: str | None) -> str | None: | |
| """ | |
| Convert an image file to a base64 string. | |
| Args: | |
| filename: str of file name | |
| return: str of base64 string | |
| """ | |
| if filename is None: | |
| return None | |
| file_path = os.path.join(output_dir, filename) | |
| if not os.path.exists(file_path) or not os.path.isfile(file_path): | |
| return None | |
| ext = filename.split('.')[-1] | |
| if ext.lower() not in ['png', 'jpg', 'webp', 'jpeg']: | |
| ext = 'png' | |
| img = Image.open(file_path) | |
| output_buffer = BytesIO() | |
| img.save(output_buffer, format=ext.upper()) | |
| byte_data = output_buffer.getvalue() | |
| base64_str = base64.b64encode(byte_data).decode('utf-8') | |
| return f"data:image/{ext};base64," + base64_str | |
| def output_file_to_bytesimg(filename: str | None) -> bytes | None: | |
| """ | |
| Convert an image file to a bytes string. | |
| Args: | |
| filename: str of file name | |
| return: bytes of image data | |
| """ | |
| if filename is None: | |
| return None | |
| file_path = os.path.join(output_dir, filename) | |
| if not os.path.exists(file_path) or not os.path.isfile(file_path): | |
| return None | |
| img = Image.open(file_path) | |
| output_buffer = BytesIO() | |
| img.save(output_buffer, format='PNG') | |
| byte_data = output_buffer.getvalue() | |
| return byte_data | |
| def get_file_serve_url(filename: str | None) -> str | None: | |
| """ | |
| Get the static serve url of an image file. | |
| Args: | |
| filename: str of file name | |
| return: str of static serve url | |
| """ | |
| if filename is None: | |
| return None | |
| return STATIC_SERVER_BASE + '/'.join(filename.split('/')[-2:]) | |