Spaces:
Configuration error
Configuration error
import { Router } from 'express' | |
import { Request, Response } from 'express' | |
import multer from 'multer' | |
import path from 'path' | |
import fs from 'fs' | |
const router = Router() | |
// Configure multer for file uploads | |
const storage = multer.diskStorage({ | |
destination: (req, file, cb) => { | |
const uploadDir = path.join(__dirname, '../../uploads') | |
if (!fs.existsSync(uploadDir)) { | |
fs.mkdirSync(uploadDir, { recursive: true }) | |
} | |
cb(null, uploadDir) | |
}, | |
filename: (req, file, cb) => { | |
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) | |
cb(null, file.fieldname + '-' + uniqueSuffix + path.extname(file.originalname)) | |
} | |
}) | |
const upload = multer({ | |
storage, | |
limits: { | |
fileSize: 10 * 1024 * 1024, // 10MB limit | |
}, | |
fileFilter: (req, file, cb): void => { | |
// Allow images, videos, audio, and documents | |
const allowedTypes = /jpeg|jpg|png|gif|webp|mp4|webm|mp3|wav|pdf|doc|docx|txt/ | |
const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase()) | |
const mimetype = allowedTypes.test(file.mimetype) | |
if (mimetype && extname) { | |
return cb(null, true) | |
} else { | |
cb(new Error('Invalid file type')) | |
} | |
} | |
}) | |
// Upload single file | |
router.post('/single', upload.single('file'), async (req: Request, res: Response): Promise<any> => { | |
try { | |
if (!req.file) { | |
return res.status(400).json({ | |
success: false, | |
error: 'No file uploaded' | |
}) | |
} | |
const fileUrl = `/uploads/${req.file.filename}` | |
return res.json({ | |
success: true, | |
data: { | |
id: req.file.filename, | |
filename: req.file.originalname, | |
url: fileUrl, | |
size: req.file.size, | |
mimetype: req.file.mimetype, | |
uploadedAt: new Date() | |
} | |
}) | |
} catch (error) { | |
return res.status(500).json({ | |
success: false, | |
error: 'Failed to upload file' | |
}) | |
} | |
}) | |
// Upload multiple files | |
router.post('/multiple', upload.array('files', 10), async (req: Request, res: Response): Promise<any> => { | |
try { | |
const files = req.files as Express.Multer.File[] | |
if (!files || files.length === 0) { | |
return res.status(400).json({ | |
success: false, | |
error: 'No files uploaded' | |
}) | |
} | |
const uploadedFiles = files.map(file => ({ | |
id: file.filename, | |
filename: file.originalname, | |
url: `/uploads/${file.filename}`, | |
size: file.size, | |
mimetype: file.mimetype, | |
uploadedAt: new Date() | |
})) | |
return res.json({ | |
success: true, | |
data: uploadedFiles | |
}) | |
} catch (error) { | |
return res.status(500).json({ | |
success: false, | |
error: 'Failed to upload files' | |
}) | |
} | |
}) | |
// Upload avatar | |
router.post('/avatar', upload.single('avatar'), async (req: Request, res: Response): Promise<any> => { | |
try { | |
if (!req.file) { | |
return res.status(400).json({ | |
success: false, | |
error: 'No avatar uploaded' | |
}) | |
} | |
// Check if it's an image | |
if (!req.file.mimetype.startsWith('image/')) { | |
return res.status(400).json({ | |
success: false, | |
error: 'Avatar must be an image' | |
}) | |
} | |
const avatarUrl = `/uploads/${req.file.filename}` | |
// TODO: Update user avatar in database | |
return res.json({ | |
success: true, | |
data: { | |
avatarUrl, | |
uploadedAt: new Date() | |
} | |
}) | |
} catch (error) { | |
return res.status(500).json({ | |
success: false, | |
error: 'Failed to upload avatar' | |
}) | |
} | |
}) | |
// Delete file | |
router.delete('/:filename', async (req: Request, res: Response): Promise<any> => { | |
try { | |
const { filename } = req.params | |
const filePath = path.join(__dirname, '../../uploads', filename!) | |
if (fs.existsSync(filePath)) { | |
fs.unlinkSync(filePath) | |
return res.json({ | |
success: true, | |
message: 'File deleted successfully' | |
}) | |
} else { | |
return res.status(404).json({ | |
success: false, | |
error: 'File not found' | |
}) | |
} | |
} catch (error) { | |
return res.status(500).json({ | |
success: false, | |
error: 'Failed to delete file' | |
}) | |
} | |
}) | |
export default router | |