const express = require('express'); const multer = require('multer'); const path = require('path'); const fs = require('fs'); const { v4: uuidv4 } = require('uuid'); const { optionalAuth } = require('../middleware/auth'); const router = express.Router(); // 确保上传目录存在 const uploadDir = path.join(__dirname, '../uploads'); if (!fs.existsSync(uploadDir)) { fs.mkdirSync(uploadDir, { recursive: true }); } // Multer配置 const storage = multer.diskStorage({ destination: (req, file, cb) => { cb(null, uploadDir); }, filename: (req, file, cb) => { const uniqueName = `${uuidv4()}-${file.originalname}`; cb(null, uniqueName); } }); const fileFilter = (req, file, cb) => { // 检查文件类型 if (file.mimetype === 'application/pdf') { cb(null, true); } else { cb(new Error('只支持PDF文件格式'), false); } }; const upload = multer({ storage, fileFilter, limits: { fileSize: 50 * 1024 * 1024, // 50MB限制 } }); // 上传文件 router.post('/upload', optionalAuth, upload.single('file'), async (req, res) => { try { if (!req.file) { return res.status(400).json({ success: false, message: '未找到上传的文件' }); } const fileInfo = { fileId: uuidv4(), originalName: req.file.originalname, fileName: req.file.filename, fileSize: req.file.size, mimeType: req.file.mimetype, uploadTime: new Date(), userId: req.user?.userId || null, filePath: req.file.path }; // 这里应该保存到数据库 // await FileModel.create(fileInfo); res.json({ success: true, message: '文件上传成功', data: { fileId: fileInfo.fileId, originalName: fileInfo.originalName, fileSize: fileInfo.fileSize, uploadTime: fileInfo.uploadTime } }); } catch (error) { console.error('文件上传错误:', error); res.status(500).json({ success: false, message: '文件上传失败' }); } }); // 获取文件信息 router.get('/:fileId', optionalAuth, async (req, res) => { try { const { fileId } = req.params; // 这里应该从数据库查询 // const file = await FileModel.findOne({ fileId }); // 模拟数据 const file = { fileId, originalName: '示例文档.pdf', fileSize: 2048576, mimeType: 'application/pdf', uploadTime: new Date(), status: 'ready' }; if (!file) { return res.status(404).json({ success: false, message: '文件未找到' }); } res.json({ success: true, data: file }); } catch (error) { console.error('获取文件信息错误:', error); res.status(500).json({ success: false, message: '获取文件信息失败' }); } }); // 删除文件 router.delete('/:fileId', optionalAuth, async (req, res) => { try { const { fileId } = req.params; // 这里应该从数据库查询文件信息 // const file = await FileModel.findOne({ fileId }); // 删除物理文件 const uploadDir = path.join(__dirname, '../uploads'); const files = fs.readdirSync(uploadDir); const targetFile = files.find(file => file.includes(fileId)); if (targetFile) { fs.unlinkSync(path.join(uploadDir, targetFile)); } // 从数据库删除记录 // await FileModel.deleteOne({ fileId }); res.json({ success: true, message: '文件删除成功' }); } catch (error) { console.error('删除文件错误:', error); res.status(500).json({ success: false, message: '删除文件失败' }); } }); // 下载文件 router.get('/download/:fileName', (req, res) => { try { const { fileName } = req.params; const filePath = path.join(uploadDir, fileName); if (!fs.existsSync(filePath)) { return res.status(404).json({ success: false, message: '文件不存在' }); } res.download(filePath, (err) => { if (err) { console.error('文件下载错误:', err); res.status(500).json({ success: false, message: '文件下载失败' }); } }); } catch (error) { console.error('下载文件错误:', error); res.status(500).json({ success: false, message: '下载文件失败' }); } }); module.exports = router;