create($importData); $zip = static::zipUploadFromData($zipData, $files); $targetPath = storage_path($import->path); $targetDir = dirname($targetPath); if (!file_exists($targetDir)) { mkdir($targetDir); } rename($zip->getRealPath(), $targetPath); return $import; } public static function deleteZipForImport(Import $import): void { $path = storage_path($import->path); if (file_exists($path)) { unlink($path); } } public static function zipUploadFromData(array $data, array $files = []): UploadedFile { $zipFile = tempnam(sys_get_temp_dir(), 'bstest-'); $zip = new ZipArchive(); $zip->open($zipFile, ZipArchive::CREATE); $zip->addFromString('data.json', json_encode($data)); foreach ($files as $name => $file) { $zip->addFile($file, "files/$name"); } $zip->close(); return new UploadedFile($zipFile, 'upload.zip', 'application/zip', null, true); } public static function extractFromZipResponse(TestResponse $response): ZipResultData { $zipData = $response->streamedContent(); $zipFile = tempnam(sys_get_temp_dir(), 'bstest-'); file_put_contents($zipFile, $zipData); $extractDir = tempnam(sys_get_temp_dir(), 'bstestextracted-'); if (file_exists($extractDir)) { unlink($extractDir); } mkdir($extractDir); $zip = new ZipArchive(); $zip->open($zipFile, ZipArchive::RDONLY); $zip->extractTo($extractDir); $dataJson = file_get_contents($extractDir . DIRECTORY_SEPARATOR . "data.json"); $data = json_decode($dataJson, true); return new ZipResultData( $zipFile, $extractDir, $data, ); } }