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.
1. Create a new zip file
2. Overwrite an existing zip file
3. Create a new zip file and add files to be inside a folder
4. Create a new zip file and move the files to be in different folders
5. Create a zip file with all files from a directory
6. Add multiple files and directories to a zip file
Create a new zip file
The following code will open a zip file
test_new.zip
and add a few files into it.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $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 flagZipArchive::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 asnewfile.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.
1
2
3
4
5
6
7
8
9
10
| $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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $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
1
2
3
4
5
6
7
8
9
10
| $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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| $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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| $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
0 comments:
Post a Comment