Scripts

Zip uitpakken

Met deze functie kan je een zip-bestandje uitpakken. Het enige dat je de functie hoeft te vertellen is welk zip-bestandje uitgepakt moet worden, en waar het naartoe uitgepakt moet worden. Ik was op zoek naar zo'n functie, maar ik kon alleen scripts vinden die geen directories ondersteunen. Met deze functie kan je je directories oneindig diep nesten. Ik heb het geschreven, omdat bij mijn webhost je alleen bestanden één voor één kunt uploaden (of met ftp, natuurlijk). Nu kan ik gewoon een heleboel bestanden, of gewoon een hele website, inpakken naar een zip-bestandje, dat uploaden, en met deze functie het zip-bestandje op de server laten uitpakken. Het zal vast wel beter/efficiënter kunnen, dus commentaar is altijd welkom ;) Edit's: Zie onderaan

zip-uitpakken
[b]Dit is de functie:[/b]

[code]<?php

function extract_zip($zip_file, $to_path = '.') {
	// Check if $to_path exists
	if ( ! chdir($to_path)) {
		return false;
	}
	$absolute_to_path = getcwd();
	chdir(dirname(__FILE__));
	
	// Open zip file
	if ( ! $zip = zip_open($zip_file)) {
		return false;
	}
	
	// Check each item in zip file
	while ($entry = zip_read($zip)) {
		// Check if it's not a directory
		if (zip_entry_filesize($entry) != 0) {
			$parts = explode('/', $zip_entry_name($entry));
			$filename = array_pop($parts);
			$path = count($parts) == 0 ? '.' : implode('/', $parts);
			chdir($absolute_to_path);
			
			// Create directory
			if (! is_dir($path) && ! mkdir($path, 0777, true)) {
				return false;
			}
			chdir($path);
			
			// Save file
			if (! zip_entry_open($zip, $entry)) {
				return false;
			}
			if (file_put_contents($filename, zip_entry_read($entry)) === false) {
				return false;
			}
			zip_entry_close($entry);
		}
	}
	
	// close zip file
	zip_close($zip);
	
	// return true when no error occured
	return true;
}

?>[/code]

[b]Je kunt de functie zo gebruiken:[/b]

[code]<?php
extract_zip('zipfile.zip', 'path/where_to/extract');
?>[/code]

[b]Edit:[/b]
De efficiëntie verbeterd.
[code]<?php
$filename = strrchr(zip_entry_name($entry), '/');
$path = str_replace($filename, '', zip_entry_name($entry));
$filename = substr($filename, 1);
if ($filename == '') {
	$filename = $path;
	$path = '.';
}
?>[/code]
veranderd in:
[code]<?php
$parts = explode('/', $zip_entry_name($entry));
$filename = array_pop($parts);
$path = count($parts) == 0 ? '.' : implode('/', $parts);
?>[/code]

Reacties

0
Nog geen reacties.