""" 文件上传API接口 """ import base64 import os from flask import Blueprint, request, jsonify from werkzeug.utils import secure_filename import uuid upload_bp = Blueprint('upload', __name__) ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'} MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB def allowed_file(filename): """检查文件扩展名是否允许""" return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS def get_file_size(file): """获取文件大小""" file.seek(0, 2) # 移动到文件末尾 size = file.tell() file.seek(0) # 重置到文件开头 return size @upload_bp.route('/api/upload', methods=['POST']) def upload_file(): """ 上传图片文件 请求参数: - file: 图片文件 返回参数: - base64_data: 图片的base64编码 - filename: 原始文件名 - size: 文件大小 """ try: # 检查是否有文件 if 'file' not in request.files: return jsonify({'error': '没有选择文件'}), 400 file = request.files['file'] # 检查文件名 if file.filename == '': return jsonify({'error': '没有选择文件'}), 400 # 检查文件类型 if not allowed_file(file.filename): return jsonify({'error': f'不支持的文件类型,支持的格式: {", ".join(ALLOWED_EXTENSIONS)}'}), 400 # 检查文件大小 file_size = get_file_size(file) if file_size > MAX_FILE_SIZE: return jsonify({'error': f'文件大小超过限制 ({MAX_FILE_SIZE // (1024*1024)}MB)'}), 400 # 读取文件内容并转换为base64 file_content = file.read() base64_data = base64.b64encode(file_content).decode('utf-8') # 获取文件扩展名 file_extension = file.filename.rsplit('.', 1)[1].lower() # 构造data URL格式 mime_type = f'image/{file_extension if file_extension != "jpg" else "jpeg"}' data_url = f'data:{mime_type};base64,{base64_data}' return jsonify({ 'success': True, 'base64_data': data_url, 'filename': secure_filename(file.filename), 'size': file_size, 'mime_type': mime_type }) except Exception as e: return jsonify({'error': f'文件上传失败: {str(e)}'}), 500 @upload_bp.route('/api/upload/validate', methods=['POST']) def validate_base64_image(): """ 验证base64图片数据 请求参数: - base64_data: base64编码的图片数据 """ try: data = request.get_json() base64_data = data.get('base64_data', '') if not base64_data: return jsonify({'error': 'base64数据不能为空'}), 400 # 检查是否是有效的data URL格式 if not base64_data.startswith('data:image/'): return jsonify({'error': '无效的图片数据格式'}), 400 # 提取base64部分 try: header, encoded = base64_data.split(',', 1) decoded_data = base64.b64decode(encoded) return jsonify({ 'success': True, 'size': len(decoded_data), 'valid': True }) except Exception: return jsonify({'error': '无效的base64编码'}), 400 except Exception as e: return jsonify({'error': f'验证失败: {str(e)}'}), 500