How to create a zip file using PHP

How to create a zip file using PHP

Recently I had to write a script to create a zip file containing different files and folders. PHP has a ZipArchive class which can be used easily to create zip files. In this article we will see how to create zip files in PHP. We will create different zip files from different files and folders.

Create a new zip file

The following code will open a zip file test_new.zip and add a few files into it.

	$zip = new ZipArchive;
	if ($zip->open('test_new.zip', ZipArchive::CREATE) === TRUE)
	{
		// Add files to the zip file
		$zip->addFile('test.txt');
		$zip->addFile('test.pdf');

		// Add random.txt file to zip and rename it to newfile.txt
		$zip->addFile('random.txt', 'newfile.txt');

		// Add a file new.txt file to zip using the text specified
		$zip->addFromString('new.txt', 'text to be added to the new.txt file');

		// All files are added, so close the zip file.
		$zip->close();
	}
Explanation of code
  • Line 1 creates an object of the ZipArchive class
  • Line 2 opens a file with filename as test_new.zip so that we can add files to it. The flag ZipArchive::CREATE specifies that we want to create a new zip file
  • Lines 5 & 6 are used to add files to the zip file
  • Line 9 is used to add a file with name random.txt to the zip file and rename it in the zipfile as newfile.txt
  • Line 12 is used to add a new file new.txt with contents of the file as ‘text to be added to the new.txt file’
  • Line 15 closes and saves the changes to the zip file

Note: Sometimes there can be issues when using relative paths for files. If there are any issues using paths then we can also use absolute paths for files

Overwrite an existing zip file

If you want to overwrite an existing zip file then we can use code similar to following. The flag ZipArchive::OVERWRITE overwrites the existing zip file.

	$zip = new ZipArchive;
	if ($zip->open('test_overwrite.zip', ZipArchive::OVERWRITE) === TRUE)
	{
		// Add file to the zip file
		$zip->addFile('test.txt');
		$zip->addFile('test.pdf');

		// All files are added, so close the zip file.
		$zip->close();
	}
Explanation of code
  • This code will create a file test_overwrite.zip if it already exists the file will be overwritten with this new file

Create a new zip file and add files to be inside a folder

	$zip = new ZipArchive;
	if ($zip->open('test_folder.zip', ZipArchive::CREATE) === TRUE)
	{
		// Add files to the zip file inside demo_folder
		$zip->addFile('text.txt', 'demo_folder/test.txt');
		$zip->addFile('test.pdf', 'demo_folder/test.pdf');

		// Add random.txt file to zip and rename it to newfile.txt and store in demo_folder
		$zip->addFile('random.txt', 'demo_folder/newfile.txt');

		// Add a file demo_folder/new.txt file to zip using the text specified
		$zip->addFromString('demo_folder/new.txt', 'text to be added to the new.txt file');

		// All files are added, so close the zip file.
		$zip->close();
	}
Explanation of code
  • The above code will add different files inside the zip file to be inside a folder demo_folder
  • The 2nd parameter to addfile function can be used to store the file in a new folder
  • The 1st parameter in the addFromString function can be used to store the file in a new folder

Create a new zip file and move the files to be in different folders

	$zip = new ZipArchive;
	if ($zip->open('test_folder_change.zip', ZipArchive::CREATE) === TRUE)
	{
		// Add files to the zip file
		$zip->addFile('text.txt', 'demo_folder/test.txt');
		$zip->addFile('test.pdf', 'demo_folder1/test.pdf');

		// All files are added, so close the zip file.
		$zip->close();
	}
Explanation of code
  • We store the file test.txt into demo_folder and test.pdf into demo_folder1

Create a zip file with all files from a directory

	$zip = new ZipArchive;
	if ($zip->open('test_dir.zip', ZipArchive::OVERWRITE) === TRUE)
	{
		if ($handle = opendir('demo_folder'))
		{
			// Add all files inside the directory
			while (false !== ($entry = readdir($handle)))
			{
				if ($entry != "." && $entry != ".." && !is_dir('demo_folder/' . $entry))
				{
					$zip->addFile('demo_folder/' . $entry);
				}
			}
			closedir($handle);
		}

		$zip->close();
	}
Explanation of code
  • Lines 5-16 opens a directory and creates a zip file with all files within that directory
  • Line 5 opens the directory
  • Line 7 gets the name of each file in the dir
  • Line 9 skips the “.” and “..” and any other directories
  • Line 11 adds the file into the zip file
  • Line 14 closes the directory
  • Line 17 closes the zip file

Add multiple files and directories to a zip file

The following code will add different folders and files in those directories into a zip file

	$zip = new ZipArchive;
	if ($zip->open('test_files_dirs.zip', ZipArchive::OVERWRITE) === TRUE)
	{
		// Add directory1
		if ($handle = opendir('demo_folder/directory1/'))
		{
			while (false !== ($entry = readdir($handle)))
			{
				if ($entry != "." && $entry != "..")
				{
					$zip->addFile('demo_folder/directory1/' . $entry);
				}
			}
			closedir($handle);
		}

		// Add directory2
		if ($handle = opendir('demo_folder/directory2/'))
		{
			while (false !== ($entry = readdir($handle)))
			{
				if ($entry != "." && $entry != "..")
				{
					$zip->addFile('demo_folder/directory2/' . $entry);
				}
			}
			closedir($handle);
		}

		// Add directory3
		if ($handle = opendir('demo_folder/directory3/'))
		{
			while (false !== ($entry = readdir($handle)))
			{
				if ($entry != "." && $entry != "..")
				{
					$zip->addFile('demo_folder/directory3/' . $entry);
				}
			}
			closedir($handle);
		}

		// Add more files
		$zip->addFile('demo_folder/index.txt');

		$zip->close();
	}
Explanation of code
  • Lines 5-41 adds all the files inside the directories 1,2 and 3 into the zip file inside the respective directories
  • Line 44 adds “index.txt” file to the zip file
View Demo
  1. hi,
    how to add a directory folder?

Leave a Reply