Upload public.js
Browse files- backend/src/routes/public.js +62 -33
backend/src/routes/public.js
CHANGED
@@ -778,94 +778,123 @@ router.post('/generate-share-link', async (req, res, next) => {
|
|
778 |
// 截图功能 - 返回JPEG图片
|
779 |
router.get('/screenshot/:userId/:pptId/:slideIndex?', async (req, res, next) => {
|
780 |
try {
|
781 |
-
console.log('Screenshot request received:', req.params);
|
782 |
|
783 |
const { userId, pptId, slideIndex = 0 } = req.params;
|
784 |
const slideIdx = parseInt(slideIndex);
|
785 |
const fileName = `${pptId}.json`;
|
786 |
const storageService = getStorageService();
|
787 |
|
788 |
-
console.log(
|
789 |
|
790 |
let pptData = null;
|
791 |
|
792 |
// 获取PPT数据(复用现有逻辑)
|
793 |
if (storageService === githubService && storageService.repositories) {
|
794 |
-
console.log('Checking GitHub repositories...');
|
795 |
for (let i = 0; i < storageService.repositories.length; i++) {
|
796 |
try {
|
797 |
const result = await storageService.getFile(userId, fileName, i);
|
798 |
if (result) {
|
799 |
pptData = result.content;
|
800 |
-
console.log(
|
801 |
break;
|
802 |
}
|
803 |
} catch (error) {
|
|
|
804 |
continue;
|
805 |
}
|
806 |
}
|
807 |
} else {
|
808 |
-
console.log('Checking memory storage...');
|
809 |
-
|
810 |
-
|
811 |
-
|
812 |
-
|
|
|
|
|
|
|
|
|
813 |
}
|
814 |
}
|
815 |
|
816 |
// 如果GitHub失败,尝试内存存储fallback
|
817 |
if (!pptData && storageService === githubService) {
|
818 |
-
console.log('Trying memory storage fallback...');
|
819 |
try {
|
820 |
const memoryResult = await memoryStorageService.getFile(userId, fileName);
|
821 |
if (memoryResult) {
|
822 |
pptData = memoryResult.content;
|
823 |
-
console.log('PPT data found in memory storage fallback');
|
824 |
}
|
825 |
} catch (memoryError) {
|
826 |
-
console.log('Memory storage fallback failed:', memoryError.message);
|
827 |
}
|
828 |
}
|
829 |
|
830 |
if (!pptData) {
|
831 |
-
console.log('PPT not found');
|
832 |
-
|
|
|
|
|
|
|
|
|
|
|
833 |
}
|
834 |
|
835 |
if (slideIdx >= pptData.slides.length || slideIdx < 0) {
|
836 |
-
console.log(
|
837 |
-
|
|
|
|
|
|
|
|
|
|
|
838 |
}
|
839 |
|
840 |
-
console.log('Generating HTML content...');
|
841 |
// 生成HTML内容(复用现有函数)
|
842 |
const htmlContent = generateSlideHTML(pptData, slideIdx, pptData.title);
|
843 |
|
844 |
-
console.log('Calling screenshot service...');
|
845 |
// 生成截图
|
846 |
-
const screenshot = await screenshotService.generateScreenshot(htmlContent
|
|
|
|
|
|
|
|
|
|
|
847 |
|
848 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
849 |
|
850 |
-
// 返回图片
|
851 |
-
res.setHeader('Content-Type', 'image/jpeg');
|
852 |
-
res.setHeader('Cache-Control', 'public, max-age=60'); // 1分钟缓存,减少服务器压力
|
853 |
-
res.setHeader('Content-Disposition', `inline; filename="${pptData.title}-${slideIdx + 1}.jpg"`);
|
854 |
res.send(screenshot);
|
|
|
855 |
} catch (error) {
|
856 |
-
console.error('Screenshot route error:', error);
|
857 |
console.error('Stack trace:', error.stack);
|
858 |
|
859 |
-
// 返回一个简单的错误响应而不是抛出异常
|
860 |
try {
|
861 |
-
|
862 |
-
|
863 |
-
|
864 |
-
|
865 |
-
|
866 |
-
|
867 |
} catch (responseError) {
|
868 |
-
console.error('Error sending error response:', responseError);
|
869 |
// 如果连错误响应都发送失败,调用next
|
870 |
next(error);
|
871 |
}
|
|
|
778 |
// 截图功能 - 返回JPEG图片
|
779 |
router.get('/screenshot/:userId/:pptId/:slideIndex?', async (req, res, next) => {
|
780 |
try {
|
781 |
+
console.log('📸 Screenshot request received:', req.params);
|
782 |
|
783 |
const { userId, pptId, slideIndex = 0 } = req.params;
|
784 |
const slideIdx = parseInt(slideIndex);
|
785 |
const fileName = `${pptId}.json`;
|
786 |
const storageService = getStorageService();
|
787 |
|
788 |
+
console.log(`🎯 Generating screenshot for: ${userId}/${pptId}/${slideIdx}`);
|
789 |
|
790 |
let pptData = null;
|
791 |
|
792 |
// 获取PPT数据(复用现有逻辑)
|
793 |
if (storageService === githubService && storageService.repositories) {
|
794 |
+
console.log('📂 Checking GitHub repositories...');
|
795 |
for (let i = 0; i < storageService.repositories.length; i++) {
|
796 |
try {
|
797 |
const result = await storageService.getFile(userId, fileName, i);
|
798 |
if (result) {
|
799 |
pptData = result.content;
|
800 |
+
console.log(`✅ PPT data found in repository ${i}`);
|
801 |
break;
|
802 |
}
|
803 |
} catch (error) {
|
804 |
+
console.log(`❌ Repository ${i} check failed:`, error.message);
|
805 |
continue;
|
806 |
}
|
807 |
}
|
808 |
} else {
|
809 |
+
console.log('📂 Checking memory storage...');
|
810 |
+
try {
|
811 |
+
const result = await storageService.getFile(userId, fileName);
|
812 |
+
if (result) {
|
813 |
+
pptData = result.content;
|
814 |
+
console.log('✅ PPT data found in memory storage');
|
815 |
+
}
|
816 |
+
} catch (error) {
|
817 |
+
console.log('❌ Memory storage check failed:', error.message);
|
818 |
}
|
819 |
}
|
820 |
|
821 |
// 如果GitHub失败,尝试内存存储fallback
|
822 |
if (!pptData && storageService === githubService) {
|
823 |
+
console.log('🔄 Trying memory storage fallback...');
|
824 |
try {
|
825 |
const memoryResult = await memoryStorageService.getFile(userId, fileName);
|
826 |
if (memoryResult) {
|
827 |
pptData = memoryResult.content;
|
828 |
+
console.log('✅ PPT data found in memory storage fallback');
|
829 |
}
|
830 |
} catch (memoryError) {
|
831 |
+
console.log('❌ Memory storage fallback failed:', memoryError.message);
|
832 |
}
|
833 |
}
|
834 |
|
835 |
if (!pptData) {
|
836 |
+
console.log('❌ PPT not found anywhere');
|
837 |
+
|
838 |
+
// 生成"PPT未找到"的错误图片
|
839 |
+
const errorImage = screenshotService.generateFallbackImage(960, 720, 'PPT未找到');
|
840 |
+
res.setHeader('Content-Type', 'image/svg+xml');
|
841 |
+
res.setHeader('Cache-Control', 'no-cache');
|
842 |
+
return res.send(errorImage);
|
843 |
}
|
844 |
|
845 |
if (slideIdx >= pptData.slides.length || slideIdx < 0) {
|
846 |
+
console.log(`❌ Slide index out of bounds: ${slideIdx}/${pptData.slides.length}`);
|
847 |
+
|
848 |
+
// 生成"幻灯片不存在"的错误图片
|
849 |
+
const errorImage = screenshotService.generateFallbackImage(960, 720, '幻灯片不存在');
|
850 |
+
res.setHeader('Content-Type', 'image/svg+xml');
|
851 |
+
res.setHeader('Cache-Control', 'no-cache');
|
852 |
+
return res.send(errorImage);
|
853 |
}
|
854 |
|
855 |
+
console.log('📝 Generating HTML content...');
|
856 |
// 生成HTML内容(复用现有函数)
|
857 |
const htmlContent = generateSlideHTML(pptData, slideIdx, pptData.title);
|
858 |
|
859 |
+
console.log('🎯 Calling screenshot service...');
|
860 |
// 生成截图
|
861 |
+
const screenshot = await screenshotService.generateScreenshot(htmlContent, {
|
862 |
+
format: 'jpeg',
|
863 |
+
quality: 90
|
864 |
+
});
|
865 |
+
|
866 |
+
console.log(`✅ Screenshot generated successfully, size: ${screenshot.length} bytes`);
|
867 |
|
868 |
+
// 检查是否是SVG fallback(通过内容检测)
|
869 |
+
const isSvgFallback = screenshot.toString().includes('<svg');
|
870 |
+
|
871 |
+
if (isSvgFallback) {
|
872 |
+
console.log('📋 Returning SVG fallback image');
|
873 |
+
res.setHeader('Content-Type', 'image/svg+xml');
|
874 |
+
res.setHeader('Cache-Control', 'no-cache');
|
875 |
+
res.setHeader('Content-Disposition', `inline; filename="${pptData.title}-${slideIdx + 1}-fallback.svg"`);
|
876 |
+
} else {
|
877 |
+
console.log('📸 Returning JPEG screenshot');
|
878 |
+
res.setHeader('Content-Type', 'image/jpeg');
|
879 |
+
res.setHeader('Cache-Control', 'public, max-age=300'); // 5分钟缓存
|
880 |
+
res.setHeader('Content-Disposition', `inline; filename="${pptData.title}-${slideIdx + 1}.jpg"`);
|
881 |
+
}
|
882 |
|
|
|
|
|
|
|
|
|
883 |
res.send(screenshot);
|
884 |
+
|
885 |
} catch (error) {
|
886 |
+
console.error('❌ Screenshot route error:', error);
|
887 |
console.error('Stack trace:', error.stack);
|
888 |
|
|
|
889 |
try {
|
890 |
+
// 生成错误截图
|
891 |
+
const errorImage = screenshotService.generateFallbackImage(960, 720, '截图生成失败');
|
892 |
+
res.setHeader('Content-Type', 'image/svg+xml');
|
893 |
+
res.setHeader('Cache-Control', 'no-cache');
|
894 |
+
res.setHeader('Content-Disposition', 'inline; filename="error.svg"');
|
895 |
+
res.send(errorImage);
|
896 |
} catch (responseError) {
|
897 |
+
console.error('❌ Error sending error response:', responseError);
|
898 |
// 如果连错误响应都发送失败,调用next
|
899 |
next(error);
|
900 |
}
|