dylanjameswagner
7/25/2016 - 2:24 PM

zip.php

<?php
/**
 * Zip files on server
 *
 * @usage /zip.php?source=uploads/2016&destination=uploads/2016.zip
 */

$source      = isset( $_GET['source'] )      ? $_GET['source']      : pathinfo( realpath( $file ), PATHINFO_DIRNAME ); // get the absolute path to $file
$destination = isset( $_GET['destination'] ) ? $_GET['destination'] : 'archive.zip';

function zip( $source, $destination ) {
	echo '<style>';
	echo 'th { text-align: left; }';
	echo '</style>';

	echo '<table>';
	echo '<tr><th>Source:</th><td>' . $source . '</td></tr>';
	echo '<tr><th>Destination:</th><td>' . $destination . '</td></tr>';
	echo '</table>';

	if ( ! extension_loaded( 'zip' ) || ! file_exists( $source ) ) {
		return false;
	}

	$zip = new ZipArchive();

	if ( ! $zip->open( $destination, ZIPARCHIVE::CREATE ) ) {
		return false;
	}

	$source = str_replace( '\\', '/', realpath( $source ) );

	if ( is_dir( $source ) === true ) {
		$files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $source ), RecursiveIteratorIterator::SELF_FIRST );

		foreach ( $files as $file ) {
			$file = str_replace( '\\', '/', $file );

			// ignore "." and ".." folders
			if ( in_array( substr( $file, strrpos( $file, '/' ) + 1 ), array( '.', '..' ) ) ) {
				continue;
			}

			$file = realpath( $file );

			if ( is_dir( $file ) === true ) {
				// $zip->addEmptyDir( str_replace( $source . '/', '', $file . '/' ) );
				$res = $zip->addEmptyDir( str_replace( $source . '/', '', $file . '/' ) );
			}
			else if ( is_file( $file ) === true ) {
				// $zip->addFromString( str_replace( $source . '/', '', $file ), file_get_contents( $file ) );
				$res = $zip->addFromString( str_replace( $source . '/', '', $file ), file_get_contents( $file ) );
			}
		}
	}
	else if ( is_file( $source ) === true ) {
		// $zip->addFromString( basename( $source ), file_get_contents( $source ) );
		$res = $zip->addFromString( basename( $source ), file_get_contents( $source ) );
	}

	if ( $res === TRUE ) {
		echo "<em>$source</em> compressed to <em>$destination</em>.<br>";
	}
	else {
		echo "<em>$source</em> could not be compressed.<br>";
	}

	return $zip->close();
};

zip( $source, $destination ); // zip( '/folder/to/compress/', './compressed.zip' );