- 将 routes/admin.py (672行) 拆分为 routes/admin/ 包 - 按功能模块拆分:auth, dashboard, articles, categories, tags, settings, stats, upload, authors - 端口从 16012 改为 16013 - 初始化数据库和管理员账户
130 lines
4.1 KiB
Python
130 lines
4.1 KiB
Python
"""文件上传路由:图片/附件"""
|
|
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/<int:attachment_id>/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
|