Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion dist/css/app.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions dist/css/chunk-1ca4bf0b.css

Large diffs are not rendered by default.

Binary file modified dist/fonts/iconfont.ttf
Binary file not shown.
Binary file modified dist/fonts/iconfont.woff
Binary file not shown.
Binary file modified dist/fonts/iconfont.woff2
Binary file not shown.
2 changes: 1 addition & 1 deletion dist/js/app.js

Large diffs are not rendered by default.

69 changes: 69 additions & 0 deletions dist/js/chunk-1ca4bf0b.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/js/chunk-vendors.js

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"scripts": {
"server": "cd server && npm install && node index.js",
"server:dev": "cd server && npm install && nodemon index.js"
}
}
100 changes: 100 additions & 0 deletions server/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const cors = require('cors');

const app = express();
const port = process.env.PORT || 3000;

// 启用跨域
app.use(cors());
app.use(express.json());

// 创建上传目录
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir, { recursive: true });
}

// 配置文件存储
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, uploadDir);
},
filename: function (req, file, cb) {
// 生成唯一文件名,避免重复
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
const ext = path.extname(file.originalname);
cb(null, file.fieldname + '-' + uniqueSuffix + ext);
}
});

const upload = multer({ storage: storage });

// 文件上传接口
app.post('/api/file/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ success: false, message: '没有上传文件' });
}

// 返回完整的文件URL
const fileUrl = `/api/file/${req.file.filename}`;

return res.json({
success: true,
data: {
url: fileUrl,
name: req.file.originalname,
size: req.file.size,
type: req.file.mimetype
}
});
});

// 文件获取接口
app.get('/api/file/:filename', (req, res) => {
const filename = req.params.filename;
const filePath = path.join(uploadDir, filename);

// 检查文件是否存在
if (!fs.existsSync(filePath)) {
return res.status(404).json({ success: false, message: '文件不存在' });
}

// 获取文件扩展名并设置正确的 Content-Type
const ext = path.extname(filename).toLowerCase();
const mimeTypes = {
'.txt': 'text/plain',
'.md': 'text/markdown',
'.json': 'application/json',
'.js': 'text/javascript',
'.css': 'text/css',
'.html': 'text/html',
'.xml': 'application/xml',
'.csv': 'text/csv',
'.log': 'text/plain',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
'.gif': 'image/gif',
'.bmp': 'image/bmp',
'.webp': 'image/webp',
'.svg': 'image/svg+xml',
'.pdf': 'application/pdf'
// 可以根据需要添加更多类型
};

// 设置Content-Type
if (mimeTypes[ext]) {
res.setHeader('Content-Type', mimeTypes[ext]);
}

// 发送文件
res.sendFile(filePath);
});

// 启动服务器
app.listen(port, () => {
console.log(`服务器运行在 http://localhost:${port}`);
});
Loading