chenqp 7 kuukautta sitten
vanhempi
commit
62b352b215
1 muutettua tiedostoa jossa 64 lisäystä ja 6 poistoa
  1. 64 6
      app/Service/ImportService.php

+ 64 - 6
app/Service/ImportService.php

@@ -153,30 +153,56 @@ class ImportService extends Service
 
                 if (pathinfo($filename, PATHINFO_EXTENSION) === 'xlsx') {// 检查是否为XLSX文件
                     // 提取文件到临时位置
-                    $tempXlsxFile = tempnam(sys_get_temp_dir(), 'xlsx_');
+//                    $tempXlsxFile = tempnam(sys_get_temp_dir(), 'xlsx_');
+
+                    $tempDir = sys_get_temp_dir() . '/extracted_' . uniqid();
+                    mkdir($tempDir, 0777, true);
 
                     // 提取文件到临时位置
-                    if ($zip->extractTo(sys_get_temp_dir(), [$filename]) === false) {
+                    if ($zip->extractTo($tempDir, [$filename]) === false) {
+                        $this->deleteDirectory($tempDir);
+//                        Log::channel('apiLog')->info('断点1', ["message" => $filename]);
                         continue; // 跳过提取失败的文件
                     }
 
+                    // 递归查找提取的XLSX文件
+                    $extractedFile = $this->findXlsxFile($tempDir, basename($filename));
+
                     // 获取提取出的文件的实际路径
-                    $extractedFile = sys_get_temp_dir() . '/' . basename($filename);
+//                    $extractedFile = sys_get_temp_dir() . '/' . basename($filename);
 
                     // 检查临时文件是否存在
-                    if (! file_exists($extractedFile)) continue;
+                    if (! file_exists($extractedFile)){
+                        $this->deleteDirectory($tempDir);
+//                        Log::channel('apiLog')->info('断点2', ["message" => $extractedFile]);
+                        continue;
+                    }
 
                     // 重命名提取出的文件为临时文件
-                    if (!rename($extractedFile, $tempXlsxFile)) {
+                    $tempXlsxFile = tempnam(sys_get_temp_dir(), 'xlsx_');
+                    if (! rename($extractedFile, $tempXlsxFile)) {
+                        $this->deleteDirectory($tempDir);
+//                        Log::channel('apiLog')->info('断点5', ["message" => "重命名文件失败: " . $extractedFile]);
                         continue;
                     }
 
+//                    // 重命名提取出的文件为临时文件
+//                    if (! rename($extractedFile, $tempXlsxFile)) {
+//                        Log::channel('apiLog')->info('断点3', ["message" => $tempXlsxFile]);
+//                        continue;
+//                    }
+
                     list($status,$xlsxData) = $this->processXlsxFile($tempXlsxFile);
-                    if (! $status) return [false, $xlsxData];
+                    if (! $status) {
+                        $this->deleteDirectory($tempDir);
+                        return [false, $xlsxData];
+                    }
 
                     // 将当前XLSX文件的数据添加到所有文件的数据数组中
                     $xlsxData['filename'] = $filename;
                     $allFilesData[] = $xlsxData;
+
+                    $this->deleteDirectory($tempDir);
                 }
             }
 
@@ -194,6 +220,38 @@ class ImportService extends Service
         }
     }
 
+    // 递归删除目录及其所有内容
+    function deleteDirectory($dir) {
+        if (! is_dir($dir)) {
+            return;
+        }
+
+        $files = array_diff(scandir($dir), array('.', '..'));
+        foreach ($files as $file) {
+            $path = $dir . DIRECTORY_SEPARATOR . $file;
+            if (is_dir($path)) {
+                $this->deleteDirectory($path);
+            } else {
+                unlink($path);
+            }
+        }
+        rmdir($dir);
+    }
+
+    // 递归查找XLSX文件
+    function findXlsxFile($dir, $filename) {
+        $iterator = new \RecursiveDirectoryIterator($dir);
+        $files = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST);
+
+        foreach ($files as $file) {
+            if ($file->isFile() && $file->getFilename() === $filename) {
+                return $file->getPathname();
+            }
+        }
+
+        return null;
+    }
+
     // 定义一个函数来处理XLSX文件
     function processXlsxFile($filename) {
         try {