$n, 'name' => $name, 'file' => $file, 'size' => $binaryBytes, ); $totalBinaryBytes += $binaryBytes; $nr++; } fclose($in); if (count($parts) === 0) { throw new RuntimeException('racket.zip lijkt leeg te zijn.'); } $manifest = array( 'source_file' => RACKET_ZIP_FILE, 'source_bytes' => filesize(RACKET_ZIP_FILE), 'source_mtime' => filemtime(RACKET_ZIP_FILE), 'source_sha256' => hash_file('sha256', RACKET_ZIP_FILE), 'max_base64_kib' => (int)$maxBase64Kib, 'max_base64_bytes' => $maxBase64Bytes, 'binary_chunk_bytes' => $binaryChunkBytes, 'part_count' => count($parts), 'total_binary_bytes' => $totalBinaryBytes, 'parts' => $parts, 'created_at' => gmdate('c'), ); if (file_put_contents( RACKET_ZIP_MANIFEST_FILE, json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n", LOCK_EX ) === false) { throw new RuntimeException('Kan racket.zip manifest niet schrijven: ' . RACKET_ZIP_MANIFEST_FILE); } return $manifest; } function load_racket_zip_parts_manifest() { if (!is_file(RACKET_ZIP_MANIFEST_FILE) || !is_readable(RACKET_ZIP_MANIFEST_FILE)) { throw new RuntimeException('racket.zip parts-manifest ontbreekt: ' . RACKET_ZIP_MANIFEST_FILE); } $raw = file_get_contents(RACKET_ZIP_MANIFEST_FILE); if ($raw === false) { throw new RuntimeException('Kan racket.zip parts-manifest niet lezen: ' . RACKET_ZIP_MANIFEST_FILE); } $manifest = json_decode($raw, true); if (!is_array($manifest)) { throw new RuntimeException('racket.zip parts-manifest is geen geldige JSON: ' . RACKET_ZIP_MANIFEST_FILE); } return $manifest; } function racket_zip_parts_current($manifest, $maxBase64Kib) { if (!is_array($manifest)) { return false; } if ((int)($manifest['max_base64_kib'] ?? 0) !== (int)$maxBase64Kib) { return false; } if (!is_file(RACKET_ZIP_FILE)) { return false; } if ((int)($manifest['source_bytes'] ?? -1) !== (int)filesize(RACKET_ZIP_FILE)) { return false; } if ((int)($manifest['source_mtime'] ?? -1) !== (int)filemtime(RACKET_ZIP_FILE)) { return false; } foreach (($manifest['parts'] ?? array()) as $part) { $number = (string)($part['number'] ?? ''); $file = racket_zip_part_file($number); if (!preg_match('/^[0-9]{6}$/', $number) || !is_file($file) || !is_readable($file)) { return false; } } return count($manifest['parts'] ?? array()) > 0; }