""" 富文本与文件处理模块 ============================================================= 提供文件URL处理、临时文件迁移和富文本编辑器内容处理: - get_file_url: 拼接文件域名生成完整URL - save_file: 将临时目录文件迁移到正式存储目录 - save_content: 处理富文本HTML内容,提取并保存其中的图片文件 """ import logging import os import re import time import html from config import FLASK_FILE_URL, FLASK_UPLOAD_DIR, FLASK_TEMP_PATH from utils.file import mkdir logger = logging.getLogger(__name__) def get_file_url(path): """ 获取完整的文件访问URL Args: path: 文件的相对路径,可以是空字符串、None或有效路径 Returns: 完整的文件访问URL,如果path为空则返回None """ if not path: return None return FLASK_FILE_URL + path def save_file(url, directory): """ 保存文件到指定目录 处理本站临时文件迁移:将临时目录中的文件移动到正式存储目录。 Args: url: 文件的完整URL或相对路径 directory: 目标子目录名称,用于分类存储 Returns: 文件的相对路径,失败时返回空字符串 """ if not url: return "文件地址不能为空" if url.find(FLASK_FILE_URL) != -1: if url.find("/temp") != -1: path = FLASK_UPLOAD_DIR + "/" + directory + "/" + time.strftime('%Y%m%d') mkdir(path) old_path = url.replace(FLASK_FILE_URL, FLASK_UPLOAD_DIR) new_path = FLASK_UPLOAD_DIR + "/" + directory + old_path.replace(FLASK_TEMP_PATH, "") os.rename(old_path, new_path) return new_path.replace(FLASK_UPLOAD_DIR, "") else: return url.replace(FLASK_FILE_URL, "") else: logger.warning(f"远程文件暂不支持保存: {url}") return "" def save_content(content, title, directory): """ 保存富文本编辑器内容 处理富文本HTML内容,提取其中的图片文件并保存, 同时将文件alt属性设置为文章标题(已做HTML转义防XSS)。 Args: content: 富文本HTML内容 title: 文章标题,用于设置文件alt属性 directory: 文件存储的子目录名称 Returns: 处理后的富文本内容,文件地址已被替换 """ image_urls = re.findall('img src="(.*?)"', content, re.S) for url in image_urls: image = save_file(url, directory) if image: content = content.replace(url, "[IMG_URL]" + image) title = html.escape(str(title) if title else "", quote=True) if "alt=\"\"" in content and title: content = content.replace("alt=\"\"", "alt=\"" + title + "\"") return content