| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- import { Router, Request, Response, NextFunction } from 'express';
- import { uploadVideo, uploadImage, uploadCover } from '../middleware/upload.js';
- import { authenticate } from '../middleware/auth.js';
- import { asyncHandler, AppError } from '../middleware/error.js';
- import { ERROR_CODES, HTTP_STATUS } from '@media-manager/shared';
- const router = Router();
- router.use(authenticate);
- // 包装 multer 错误处理
- const handleMulterError = (
- uploadFn: (req: Request, res: Response, next: NextFunction) => void
- ) => {
- return (req: Request, res: Response, next: NextFunction) => {
- uploadFn(req, res, (err: unknown) => {
- if (err) {
- if ((err as { code?: string }).code === 'LIMIT_FILE_SIZE') {
- return next(new AppError('文件大小超出限制', HTTP_STATUS.BAD_REQUEST, ERROR_CODES.VIDEO_TOO_LARGE));
- }
- return next(err);
- }
- next();
- });
- };
- };
- // 上传视频
- router.post(
- '/video',
- handleMulterError(uploadVideo),
- asyncHandler(async (req, res) => {
- if (!req.file) {
- throw new AppError('未上传文件', HTTP_STATUS.BAD_REQUEST, ERROR_CODES.VALIDATION);
- }
-
- res.json({
- success: true,
- data: {
- filename: req.file.filename,
- originalname: req.file.originalname,
- path: `/uploads/videos/${req.file.filename}`,
- size: req.file.size,
- mimetype: req.file.mimetype,
- },
- });
- })
- );
- // 上传图片
- router.post(
- '/image',
- handleMulterError(uploadImage),
- asyncHandler(async (req, res) => {
- if (!req.file) {
- throw new AppError('未上传文件', HTTP_STATUS.BAD_REQUEST, ERROR_CODES.VALIDATION);
- }
-
- res.json({
- success: true,
- data: {
- filename: req.file.filename,
- originalname: req.file.originalname,
- path: `/uploads/images/${req.file.filename}`,
- size: req.file.size,
- mimetype: req.file.mimetype,
- },
- });
- })
- );
- // 上传封面
- router.post(
- '/cover',
- handleMulterError(uploadCover),
- asyncHandler(async (req, res) => {
- if (!req.file) {
- throw new AppError('未上传文件', HTTP_STATUS.BAD_REQUEST, ERROR_CODES.VALIDATION);
- }
-
- res.json({
- success: true,
- data: {
- filename: req.file.filename,
- originalname: req.file.originalname,
- path: `/uploads/covers/${req.file.filename}`,
- size: req.file.size,
- mimetype: req.file.mimetype,
- },
- });
- })
- );
- // 上传头像
- router.post(
- '/avatar',
- handleMulterError(uploadImage),
- asyncHandler(async (req, res) => {
- if (!req.file) {
- throw new AppError('未上传文件', HTTP_STATUS.BAD_REQUEST, ERROR_CODES.VALIDATION);
- }
-
- res.json({
- success: true,
- data: {
- filename: req.file.filename,
- originalname: req.file.originalname,
- path: `/uploads/images/${req.file.filename}`,
- size: req.file.size,
- mimetype: req.file.mimetype,
- },
- });
- })
- );
- export default router;
|