Spaces:
Configuration error
Configuration error
File size: 4,175 Bytes
2c6bb7b 1bd1278 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b 1bd1278 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b e2b6475 2c6bb7b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
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
|