root
update space
675e98c
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const mime = require('mime-types');
const router = express.Router();
const uploadDir = path.join(__dirname, '../../uploads');
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir, { recursive: true });
}
const supportedExtensions = [
'.jpg', '.jpeg', '.png', '.gif', '.webp',
'.mp4', '.mov', '.avi', '.mkv', '.webm',
'.mp3', '.wav', '.ogg', '.m4a'
];
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, uploadDir);
},
filename: (req, file, cb) => {
const ext = path.extname(file.originalname).toLowerCase();
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
cb(null, 'file-' + uniqueSuffix + ext);
}
});
const fileFilter = (req, file, cb) => {
const ext = path.extname(file.originalname).toLowerCase();
if (supportedExtensions.includes(ext)) {
cb(null, true);
} else {
cb(new Error(`Unsupported file type: ${ext}`), false);
}
};
const upload = multer({
storage: storage,
fileFilter: fileFilter,
limits: {
fileSize: 100 * 1024 * 1024 // 100MB
}
});
router.post('/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ error: 'No file uploaded or invalid file type' });
}
const fileType = mime.lookup(req.file.originalname) || 'application/octet-stream';
const fileCategory = getFileCategory(fileType);
const protocol = req.secure || req.headers['x-forwarded-proto'] === 'https' ? 'https' : 'http';
const host = req.headers.host || `${DOMAIN}:${PORT}`;
res.json({
message: 'File uploaded successfully',
file: {
originalName: req.file.originalname,
fileName: req.file.filename,
size: req.file.size,
type: fileType,
category: fileCategory,
url: `${protocol}://${host}/api/files/${req.file.filename}`
}
});
});
router.get('/files/:filename', (req, res) => {
const filePath = path.join(uploadDir, req.params.filename);
if (!fs.existsSync(filePath)) {
return res.status(404).json({
error: 'File not found',
message: `The requested file does not exist on the server`
});
}
const contentType = mime.lookup(filePath) || 'application/octet-stream';
res.setHeader('Content-Type', contentType);
res.sendFile(filePath);
});
function getFileCategory(mimeType) {
if (mimeType.startsWith('image/')) return 'image';
if (mimeType.startsWith('video/')) return 'video';
if (mimeType.startsWith('audio/')) return 'audio';
return 'other';
}
module.exports = router;