Files
tech-blog/app/routes/admin/upload.py
hz4th_coder 503a9780b2 refactor: 拆分admin路由为模块化结构,端口改为16013
- 将 routes/admin.py (672行) 拆分为 routes/admin/ 包
- 按功能模块拆分:auth, dashboard, articles, categories, tags, settings, stats, upload, authors
- 端口从 16012 改为 16013
- 初始化数据库和管理员账户
2026-06-25 11:21:36 +08:00

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