$files->zip() method

Creates a ZIP file


// Create zip of all files in directory $dir to file $zip
$dir = $config->paths->cache . "my-files/";
$zip = $config->paths->cache . "my-file.zip";
$result = $files->zip($zip, $dir);

echo "<h3>These files were added to the ZIP:</h3>";
foreach($result['files'] as $file) {
  echo "<li>" $sanitizer->entities($file) . "</li>";

if(count($result['errors'])) {
  echo "<h3>There were errors:</h3>";
  foreach($result['errors'] as $error) {
    echo "<li>" . $sanitizer->entities($error) . "</li>";


// basic usage
$array = $files->zip(string $zipfile, $files);

// usage with all arguments
$array = $files->zip(string $zipfile, $files, array $options = []);



Full path and filename to create or update (i.e. /path/to/myfile.zip)

filesarray, string

Array of files to add (full path and filename), or directory (string) to add. If given a directory, it will recursively add everything in that directory.

options (optional)array

Associative array of options to modify default behavior:

  • allowHidden (boolean or array): allow hidden files? May be boolean, or array of hidden files (basenames) you allow. (default=false) Note that if you actually specify a hidden file in your $files argument, then that overrides this.
  • allowEmptyDirs (boolean): allow empty directories in the ZIP file? (default=true)
  • overwrite (boolean): Replaces ZIP file if already present (rather than adding to it) (default=false)
  • maxDepth (int): Max dir depth 0 for no limit (default=0). Specify 1 to stay only in dirs listed in $files.
  • exclude (array): Files or directories to exclude
  • dir (string): Directory name to prepend to added files in the ZIP

Return value


Returns associative array of:

  • files (array): all files that were added
  • errors (array): files that failed to add, if any


Method can throw exceptions on error:

  • WireException - Original ZIP file creation error conditions result in WireException being thrown.

See Also

$files methods and properties

API reference based on ProcessWire core version 3.0.160

Twitter updates

  • ProcessWire 3.0.161 adds support for selector operator stacking, enabling you automatically broaden searches in a single pages.find() call— More
    26 June 2020
  • ProcessWire 3.0.160 adds powerful new text-searching operators, bringing a new level of power to page-finding API calls, especially when it comes to search engine type queries. Post also includes a demo search engine where you can test it all out live— More
    19 June 2020
  • Preview of ProcessWire 3.0.160 with auto-enable of two-factor authentication, new version of TfaEmail and TfaTotp, and new selector operators coming next week. More
    12 June 2020

Latest news

  • ProcessWire Weekly #320
    In the 320th issue of ProcessWire Weekly we're going to check out the latest core updates (ProcessWire 3.0.161), a new third party module called Fieldtype Runtime only, an IndieWeb themed article from Francesco Schwarz, and more. Read on!
    Weekly.pw / 27 June 2020
  • Powerful new text-searching abilities in 3.0.160
    In ProcessWire 3.0.160 we’ve got some major upgrades and additions to our text-search abilities. This brings a whole new level of power to $pages->find() and similar API calls, especially when it comes to search engine type queries.
    Blog / 19 June 2020
  • Subscribe to weekly ProcessWire news

“I am currently managing a ProcessWire site with 2 million+ pages. It’s admirably fast, and much, much faster than any other CMS we tested.” —Nickie, Web developer