Spaces:
Sleeping
Sleeping
File size: 1,905 Bytes
97ec0e5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import config from '../config/config.js';
import { getDefaultIp } from './utils.js';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const IMAGE_DIR = path.join(__dirname, '../../public/images');
// 确保图片目录存在
if (!fs.existsSync(IMAGE_DIR)) {
fs.mkdirSync(IMAGE_DIR, { recursive: true });
}
// MIME 类型到文件扩展名映射
const MIME_TO_EXT = {
'image/jpeg': 'jpg',
'image/png': 'png',
'image/gif': 'gif',
'image/webp': 'webp'
};
/**
* 清理超过限制数量的旧图片
* @param {number} maxCount - 最大保留图片数量
*/
function cleanOldImages(maxCount = 10) {
const files = fs.readdirSync(IMAGE_DIR)
.filter(f => /\.(jpg|jpeg|png|gif|webp)$/i.test(f))
.map(f => ({
name: f,
path: path.join(IMAGE_DIR, f),
mtime: fs.statSync(path.join(IMAGE_DIR, f)).mtime.getTime()
}))
.sort((a, b) => b.mtime - a.mtime);
if (files.length > maxCount) {
files.slice(maxCount).forEach(f => fs.unlinkSync(f.path));
}
}
/**
* 保存 base64 图片到本地并返回访问 URL
* @param {string} base64Data - base64 编码的图片数据
* @param {string} mimeType - 图片 MIME 类型
* @returns {string} 图片访问 URL
*/
export function saveBase64Image(base64Data, mimeType) {
const ext = MIME_TO_EXT[mimeType] || 'jpg';
const filename = `${Date.now()}_${Math.random().toString(36).slice(2, 9)}.${ext}`;
const filepath = path.join(IMAGE_DIR, filename);
// 解码并保存
const buffer = Buffer.from(base64Data, 'base64');
fs.writeFileSync(filepath, buffer);
// 清理旧图片
cleanOldImages(config.maxImages);
// 返回访问 URL
const baseUrl = config.imageBaseUrl || `http://${getDefaultIp()}:${config.server.port}`;
return `${baseUrl}/images/${filename}`;
}
|