const express = require('express'); const multer = require('multer'); const JSZip = require('jszip'); const sharp = require('sharp'); const crypto = require('crypto'); const app = express(); // 设置 multer 用于处理文件上传 const storage = multer.memoryStorage(); const upload = multer({ storage: storage }); app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 新增 GET / 路由来提供前端页面 app.get('/', (req, res) => { res.send(` File Upload

Upload a File

`); }); app.post('/upload', upload.single('file'), async (req, res) => { try { const file = req.file; const fileName = file.originalname; const fileType = file.mimetype; const fileBuffer = file.buffer; // 压缩文件成 zip 格式 const zip = new JSZip(); zip.file(fileName, fileBuffer); const zipBuffer = await zip.generateAsync({ type: 'nodebuffer' }); // 创建包含文件信息的表格图片 const text = ` File Name: ${fileName} File Type: ${fileType} File Size: ${fileBuffer.length} bytes Created At: ${new Date().toLocaleString()} `; const imageBuffer = await sharp({ create: { width: 400, height: 300, channels: 4, background: { r: 255, g: 255, b: 255, alpha: 1 } } }) .composite([{ input: Buffer.from(text), top: 10, left: 10 }]) .jpeg() .toBuffer(); const finalBuffer = Buffer.concat([imageBuffer, zipBuffer]); // 生成随机的哈希值作为文件名 const hash = crypto.randomBytes(16).toString('hex'); const outputFileName = encodeURI(hash + '-pic.zip.jpg'); res.setHeader('Content-Type', 'image/jpeg'); res.setHeader('Content-Disposition', `attachment; filename="${outputFileName}"`); res.send(finalBuffer); } catch (error) { console.error(error); res.status(500).send('An error occurred'); } }); const PORT = process.env.PORT || 7860; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });