CatPtain commited on
Commit
4becc1f
·
verified ·
1 Parent(s): da2c691

Upload public.js

Browse files
Files changed (1) hide show
  1. backend/src/routes/public.js +84 -0
backend/src/routes/public.js CHANGED
@@ -1147,4 +1147,88 @@ router.get('/direct-image/:userId/:pptId/:slideIndex?', async (req, res, next) =
1147
  }
1148
  });
1149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1150
  export default router;
 
1147
  }
1148
  });
1149
 
1150
+ // 存储前端生成的图片数据
1151
+ const imageCache = new Map();
1152
+
1153
+ // POST endpoint to receive frontend-generated images
1154
+ router.post('/save-image/:userId/:pptId/:slideIndex', express.json({ limit: '10mb' }), async (req, res, next) => {
1155
+ try {
1156
+ const { userId, pptId, slideIndex } = req.params;
1157
+ const { imageData, format = 'jpeg', quality = 90 } = req.body;
1158
+
1159
+ if (!imageData) {
1160
+ return res.status(400).json({ error: 'Image data is required' });
1161
+ }
1162
+
1163
+ // 生成唯一的图片ID
1164
+ const imageId = `${userId}-${pptId}-${slideIndex}-${Date.now()}`;
1165
+
1166
+ // 存储图片数据到内存缓存
1167
+ imageCache.set(imageId, {
1168
+ data: imageData,
1169
+ format,
1170
+ quality,
1171
+ userId,
1172
+ pptId,
1173
+ slideIndex,
1174
+ timestamp: new Date().toISOString(),
1175
+ contentType: `image/${format === 'jpg' ? 'jpeg' : format}`
1176
+ });
1177
+
1178
+ // 设置过期时间(1小时后自动清理)
1179
+ setTimeout(() => {
1180
+ imageCache.delete(imageId);
1181
+ }, 3600000);
1182
+
1183
+ // 返回图片访问URL
1184
+ const baseUrl = req.protocol + '://' + req.get('host');
1185
+ const imageUrl = `${baseUrl}/api/public/cached-image/${imageId}`;
1186
+
1187
+ console.log(`✅ Image saved with ID: ${imageId}`);
1188
+
1189
+ res.json({
1190
+ success: true,
1191
+ imageId,
1192
+ imageUrl,
1193
+ expiresAt: new Date(Date.now() + 3600000).toISOString()
1194
+ });
1195
+
1196
+ } catch (error) {
1197
+ console.error('❌ Failed to save image:', error);
1198
+ next(error);
1199
+ }
1200
+ });
1201
+
1202
+ // GET endpoint to serve cached images
1203
+ router.get('/cached-image/:imageId', async (req, res, next) => {
1204
+ try {
1205
+ const { imageId } = req.params;
1206
+
1207
+ const cachedImage = imageCache.get(imageId);
1208
+ if (!cachedImage) {
1209
+ return res.status(404).json({ error: 'Image not found or expired' });
1210
+ }
1211
+
1212
+ // 设置响应头
1213
+ res.setHeader('Content-Type', cachedImage.contentType);
1214
+ res.setHeader('Cache-Control', 'public, max-age=3600');
1215
+ res.setHeader('Access-Control-Allow-Origin', '*');
1216
+ res.setHeader('X-Image-Source', 'frontend-generated');
1217
+ res.setHeader('X-Generation-Time', cachedImage.timestamp);
1218
+
1219
+ // 如果是base64数据,需要转换
1220
+ if (cachedImage.data.startsWith('data:')) {
1221
+ const base64Data = cachedImage.data.split(',')[1];
1222
+ const buffer = Buffer.from(base64Data, 'base64');
1223
+ res.send(buffer);
1224
+ } else {
1225
+ res.send(cachedImage.data);
1226
+ }
1227
+
1228
+ } catch (error) {
1229
+ console.error('❌ Failed to serve cached image:', error);
1230
+ next(error);
1231
+ }
1232
+ });
1233
+
1234
  export default router;