|
@@ -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 {
|