Ver Fonte

优化合并 pdf 功能

yemeishu há 9 horas atrás
pai
commit
387102428e
2 ficheiros alterados com 127 adições e 14 exclusões
  1. 23 14
      app/Services/ExamPdfExportService.php
  2. 104 0
      test_directory_fix.php

+ 23 - 14
app/Services/ExamPdfExportService.php

@@ -33,6 +33,25 @@ class ExamPdfExportService
         private readonly PdfMerger $pdfMerger
     ) {}
 
+    /**
+     * 确保exams目录存在
+     */
+    private function ensureExamsDirectory(): bool
+    {
+        $examsDir = storage_path("app/public/exams");
+
+        if (!is_dir($examsDir)) {
+            Log::info('ExamPdfExportService: 创建exams目录', ['path' => $examsDir]);
+            if (!mkdir($examsDir, 0755, true)) {
+                Log::error('ExamPdfExportService: 创建exams目录失败', ['path' => $examsDir]);
+                return false;
+            }
+            Log::info('ExamPdfExportService: exams目录创建成功', ['path' => $examsDir]);
+        }
+
+        return true;
+    }
+
     /**
      * 生成试卷 PDF(不含答案)
      */
@@ -48,15 +67,10 @@ class ExamPdfExportService
 
         // 生成PDF文件(用于合并,不上传云存储)
         $pdfPath = storage_path("app/public/exams/{$paperId}_exam.pdf");
-        $examsDir = storage_path("app/public/exams");
 
         // 【修复】确保exams目录存在
-        if (!is_dir($examsDir)) {
-            Log::info('ExamPdfExportService: 创建exams目录', ['path' => $examsDir]);
-            if (!mkdir($examsDir, 0755, true)) {
-                Log::error('ExamPdfExportService: 创建exams目录失败', ['path' => $examsDir]);
-                return null;
-            }
+        if (!$this->ensureExamsDirectory()) {
+            return null;
         }
 
         Log::info('ExamPdfExportService: 开始生成试卷PDF', ['path' => $pdfPath, 'url' => $pageUrl]);
@@ -99,15 +113,10 @@ class ExamPdfExportService
 
         // 生成PDF文件(用于合并,不上传云存储)
         $pdfPath = storage_path("app/public/exams/{$paperId}_grading.pdf");
-        $examsDir = storage_path("app/public/exams");
 
         // 【修复】确保exams目录存在
-        if (!is_dir($examsDir)) {
-            Log::info('ExamPdfExportService: 创建exams目录', ['path' => $examsDir]);
-            if (!mkdir($examsDir, 0755, true)) {
-                Log::error('ExamPdfExportService: 创建exams目录失败', ['path' => $examsDir]);
-                return null;
-            }
+        if (!$this->ensureExamsDirectory()) {
+            return null;
         }
 
         Log::info('ExamPdfExportService: 开始生成判卷PDF', ['path' => $pdfPath, 'url' => $pageUrl]);

+ 104 - 0
test_directory_fix.php

@@ -0,0 +1,104 @@
+<?php
+/**
+ * 测试PDF目录创建修复
+ * 在服务器上运行: php test_directory_fix.php
+ */
+
+// 测试1: 检查storage目录结构
+echo "=== 测试1: 检查storage目录结构 ===\n";
+$storagePath = __DIR__ . '/storage';
+$publicPath = $storagePath . '/app/public';
+$examsPath = $publicPath . '/exams';
+
+echo "Storage路径: {$storagePath}\n";
+echo "Public路径: {$publicPath}\n";
+echo "Exams路径: {$examsPath}\n\n";
+
+// 检查目录是否存在
+echo "=== 测试2: 检查目录存在性 ===\n";
+echo "storage存在: " . (is_dir($storagePath) ? "是" : "否") . "\n";
+echo "app存在: " . (is_dir($storagePath . '/app') ? "是" : "否") . "\n";
+echo "public存在: " . (is_dir($publicPath) ? "是" : "否") . "\n";
+echo "exams存在: " . (is_dir($examsPath) ? "是" : "否") . "\n\n";
+
+// 测试3: 创建exams目录
+echo "=== 测试3: 创建exams目录 ===\n";
+if (!is_dir($examsPath)) {
+    echo "exams目录不存在,正在创建...\n";
+    if (mkdir($examsPath, 0755, true)) {
+        echo "✓ exams目录创建成功\n";
+        echo "权限: " . substr(sprintf('%o', fileperms($examsPath)), -4) . "\n";
+    } else {
+        echo "✗ exams目录创建失败\n";
+        echo "错误: " . error_get_last()['message'] . "\n";
+    }
+} else {
+    echo "✓ exams目录已存在\n";
+    echo "权限: " . substr(sprintf('%o', fileperms($examsPath)), -4) . "\n";
+}
+
+// 测试4: 测试文件写入
+echo "\n=== 测试4: 测试文件写入 ===\n";
+$testFile = $examsPath . '/test_write.txt';
+$testContent = '测试时间: ' . date('Y-m-d H:i:s') . "\n";
+if (file_put_contents($testFile, $testContent)) {
+    echo "✓ 文件写入成功: {$testFile}\n";
+    if (file_exists($testFile)) {
+        echo "✓ 文件验证存在\n";
+        @unlink($testFile);
+        echo "✓ 测试文件已删除\n";
+    }
+} else {
+    echo "✗ 文件写入失败\n";
+    echo "错误: " . error_get_last()['message'] . "\n";
+}
+
+// 测试5: 检查Laravel存储路径函数
+echo "\n=== 测试5: 检查Laravel存储路径函数 ===\n";
+require_once __DIR__ . '/vendor/autoload.php';
+
+try {
+    $app = require_once __DIR__ . '/bootstrap/app.php';
+    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
+
+    // 测试storage_path函数
+    $storageAppPath = storage_path('app');
+    $storagePublicPath = storage_path('app/public');
+    $storageExamsPath = storage_path('app/public/exams');
+
+    echo "storage_path('app'): {$storageAppPath}\n";
+    echo "storage_path('app/public'): {$storagePublicPath}\n";
+    echo "storage_path('app/public/exams'): {$storageExamsPath}\n\n";
+
+    echo "=== 测试6: 使用Laravel函数创建目录 ===\n";
+    if (!is_dir($storageExamsPath)) {
+        echo "exams目录不存在,正在创建...\n";
+        if (mkdir($storageExamsPath, 0755, true)) {
+            echo "✓ Laravel路径下exams目录创建成功\n";
+            echo "完整路径: {$storageExamsPath}\n";
+        } else {
+            echo "✗ Laravel路径下exams目录创建失败\n";
+        }
+    } else {
+        echo "✓ Laravel路径下exams目录已存在\n";
+    }
+
+    // 测试文件写入
+    $testFile2 = $storageExamsPath . '/laravel_test.txt';
+    if (file_put_contents($testFile2, $testContent)) {
+        echo "✓ Laravel路径下文件写入成功\n";
+        @unlink($testFile2);
+        echo "✓ 测试文件已删除\n";
+    }
+
+} catch (Exception $e) {
+    echo "✗ Laravel初始化失败: " . $e->getMessage() . "\n";
+    echo "注意: 如果没有Laravel应用,这是正常的\n";
+}
+
+echo "\n=== 测试完成 ===\n";
+echo "如果所有测试都通过,说明目录创建功能正常\n";
+echo "如果exams目录创建失败,请检查:\n";
+echo "1. storage/app/public目录权限\n";
+echo "2. PHP进程是否有写入权限\n";
+echo "3. SELinux或其他安全策略\n";