"""文件上传路由:图片/附件""" from flask import render_template, redirect, url_for, request, flash, session, jsonify import os from app.routes.admin import admin_bp, login_required from app.services import UploadService, AttachmentService @admin_bp.route('/upload/image', methods=['POST']) @login_required def upload_image(): """上传图片(支持拖拽、粘贴、选择)""" article_id = request.form.get('article_id', type=int) uploader = session.get('admin_username', 'admin') # 检查是否有文件上传 if 'file' not in request.files: return jsonify({'success': False, 'message': '没有选择文件'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'success': False, 'message': '没有选择文件'}), 400 # 上传图片 image, error = UploadService.upload_image(file, article_id, uploader) if error: return jsonify({'success': False, 'message': error}), 400 # 返回图片URL return jsonify({ 'success': True, 'url': UploadService.get_image_url(image.filename), 'filename': image.filename }) @admin_bp.route('/upload/paste', methods=['POST']) @login_required def upload_paste(): """粘贴图片上传""" import base64 from io import BytesIO from datetime import datetime import uuid article_id = request.form.get('article_id', type=int) uploader = session.get('admin_username', 'admin') # 获取粘贴的图片数据 image_data = request.form.get('image_data') if not image_data: return jsonify({'success': False, 'message': '没有图片数据'}), 400 # 解码Base64图片 try: # 移除data:image/xxx;base64,前缀 if 'base64,' in image_data: image_data = image_data.split('base64,')[1] image_bytes = base64.b64decode(image_data) # 确定图片格式 ext = 'png' # 默认png # 生成文件名 filename = f'{datetime.now().strftime("%Y%m%d")}_{uuid.uuid4().hex[:8]}.{ext}' # 保存文件 upload_folder = UploadService.get_upload_folder() filepath = os.path.join(upload_folder, filename) with open(filepath, 'wb') as f: f.write(image_bytes) # 记录到数据库 from app.models import UploadedImage from app import db image = UploadedImage( filename=filename, filepath=filepath, article_id=article_id, uploader=uploader ) db.session.add(image) db.session.commit() return jsonify({ 'success': True, 'url': UploadService.get_image_url(filename), 'filename': filename }) except Exception as e: return jsonify({'success': False, 'message': str(e)}), 400 @admin_bp.route('/upload/attachment', methods=['POST']) @login_required def upload_attachment(): """上传附件""" article_id = request.form.get('article_id', type=int) description = request.form.get('description', '') if 'file' not in request.files: return jsonify({'success': False, 'message': '没有选择文件'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'success': False, 'message': '没有选择文件'}), 400 attachment, error = UploadService.upload_attachment(file, article_id, description) if error: return jsonify({'success': False, 'message': error}), 400 return jsonify({ 'success': True, 'attachment': { 'id': attachment.id, 'filename': attachment.filename, 'filesize': attachment.get_filesize_display(), 'url': f'/uploads/{attachment.filename}' } }) @admin_bp.route('/attachment//delete', methods=['POST']) @login_required def delete_attachment(attachment_id): """删除附件""" if AttachmentService.delete_attachment(attachment_id): return jsonify({'success': True}) return jsonify({'success': False, 'message': '删除失败'}), 400