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}`);
});