ZipArchive::open
(PHP 5 >= 5.2.0, PECL zip >= 1.1.0)
ZipArchive::open — Open a ZIP file archive
Описание
Opens a new zip archive for reading, writing or modifying.
Список параметров
- filename
-
The file name of the ZIP archive to open.
- flags
-
The mode to use to open the archive.
-
ZIPARCHIVE::OVERWRITE
-
ZIPARCHIVE::CREATE
-
ZIPARCHIVE::EXCL
-
ZIPARCHIVE::CHECKCONS
-
Возвращаемые значения
- Error codes
-
Returns TRUE on success or the error code.
-
ZIPARCHIVE::ER_EXISTS
-
ZIPARCHIVE::ER_INCONS
-
ZIPARCHIVE::ER_INVAL
-
ZIPARCHIVE::ER_MEMORY
-
ZIPARCHIVE::ER_NOENT
-
ZIPARCHIVE::ER_NOZIP
-
ZIPARCHIVE::ER_OPEN
-
ZIPARCHIVE::ER_READ
-
ZIPARCHIVE::ER_SEEK
-
Примеры
Пример #1 Open and extract
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip');
if ($res === TRUE) {
echo 'ok';
$zip->extractTo('test');
$zip->close();
} else {
echo 'failed, code:' . $res;
}
?>
Пример #2 Create an archive
<?php
$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
$zip->addFromString('test.txt', 'file content goes here');
$zip->addFile('data.txt', 'entryname.txt');
$zip->close();
echo 'ok';
} else {
echo 'failed';
}
?>
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для сжатия и архивации
- Zip
- Функция ZipArchive::addEmptyDir() - Добавляет новую директорию
- Функция ZipArchive::addFile() - Добавляет в ZIP-архив файл по указанному пути
- Функция ZipArchive::addFromString() - Добавяет файл в ZIP-архив, используя его содержимое
- Функция ZipArchive::addGlob() - Add files from a directory by glob pattern
- Функция ZipArchive::addPattern() - Add files from a directory by PCRE pattern
- Функция ZipArchive::close() - Закрывает активный архив (открытый или вновь созданный)
- Функция ZipArchive::deleteIndex() - Удаляет элемент в архиве, используя его индекс
- Функция ZipArchive::deleteName() - Удаляет элемент в архиве, используя его имя
- Функция ZipArchive::extractTo() - Извлекает содержимое архива
- Функция ZipArchive::getArchiveComment() - Возвращает комментарий ZIP-архива
- Функция ZipArchive::getCommentIndex() - Возвращает комментарий элемента, используя его индекс
- Функция ZipArchive::getCommentName() - Возвращает комментарий элемента, используя его имя
- Функция ZipArchive::getExternalAttributesIndex() - Retrieve the external attributes of an entry defined by its index
- Функция ZipArchive::getExternalAttributesName() - Retrieve the external attributes of an entry defined by its name
- Функция ZipArchive::getFromIndex() - Возвращает содержимое элемента по его индексу
- Функция ZipArchive::getFromName() - Возвращает содержимое элемента по его имени
- Функция ZipArchive::getNameIndex() - Возвращает имя элемента по его индексу
- Функция ZipArchive::getStatusString() - Возвращают статус сообщения об ошибке, системный и/или zip-статус
- Функция ZipArchive::getStream() - Получить дескриптор файла элемента, определенный по имени элемента (только для чтения)
- Функция ZipArchive::locateName() - Возвращает индекс элемента в архиве
- Функция ZipArchive::open() - Открывает ZIP-архив
- Функция ZipArchive::renameIndex() - Переименовывает элемент по его индексу
- Функция ZipArchive::renameName() - Переименовывает элемент по его имени
- Функция ZipArchive::setArchiveComment() - Устанавливает комментарий к ZIP-архиву
- Функция ZipArchive::setCommentIndex() - Устанавливает комментарий к элементу по его индексу
- Функция ZipArchive::setCommentName() - Устанавливает комментарий к элементу, заданному по имени
- ZipArchive::setCompressionIndex
- ZipArchive::setCompressionName
- Функция ZipArchive::setExternalAttributesIndex() - Set the external attributes of an entry defined by its index
- Функция ZipArchive::setExternalAttributesName() - Set the external attributes of an entry defined by its name
- ZipArchive::setPassword
- Функция ZipArchive::statIndex() - Получение детальной информации о элементе по его индексу
- Функция ZipArchive::statName() - Получение детальной информации о элементе по его имени
- Функция ZipArchive::unchangeAll() - Отменяет все изменения, сделанные в архиве
- Функция ZipArchive::unchangeArchive() - Возвращает все глобальные изменения, сделанные в архиве
- Функция ZipArchive::unchangeIndex() - Отменяет все измения у позиции с заданным индексом
- Функция ZipArchive::unchangeName() - Отменяет все измения у позиции с заданным именем
Коментарии
If the directory you are writing or saving into does not have the correct permissions set, you won't get any error messages and it will look like everything worked fine... except it won't have changed!
Instead make sure you collect the return value of ZipArchive::close(). If it is false... it didn't work.
It seems the filename has to end in '.zip', so this suffix must be added when using tempnam() to create a random temporary file name.
If you try this to open a file with creation in mind (= empty zip to fill with other files), this may not work :
$res = $zip->open($zip_file, ZipArchive::CREATE);
// you may get false
Try this instead, it should work :
$res = $zip->open($zip_file, ZIPARCHIVE::OVERWRITE);
The file name does not need to end in '.zip' if it is created using tempnam(). You just need to overwrite the file instead of trying to read it:
<?php
$file = tempnam("tmp", "zip");
$zip = new ZipArchive();
// Zip will open and overwrite the file, rather than try to read it.
$zip->open($file, ZipArchive::OVERWRITE);
$zip->close();
// Stream the file to the client
header("Content-Type: application/zip");
header("Content-Length: " . filesize($file));
header("Content-Disposition: attachment; filename=\"a_zip_file.zip\"");
readfile($file);
unlink($file);
?>
<?php
/*
Hi!
I made a little script about checking content and "secure repacking"
*/
$somefile = "zip.zip";
$someurl = "/some/url"
$zip = new ZipArchive;
$open = $zip->open($somefile, ZIPARCHIVE::CHECKCONS);
// If the archive is broken(or just another file renamed to *.zip) the function will return error on httpd under windows, so it's good to check if the archive is ok with ZIPARCHIVE::CHECKCONS
if ($open === TRUE) {
if(!$zip->extractTo($someurl)) {
die ("Error during extracting");
}
$zip->close();
}
$new_archive_name = "new.zip";
$new_zip = new ZipArchive;
$new_open = $new_zip->open($new_archive_name, ZIPARCHIVE::CREATE);
if ($new_open === TRUE) {
$dir = opendir($someurl);
while ($file = readdir($dir)) {
if ($file == "." || $file == "..") { } else {
//We do not wanna this files in the new zip archive
if (!$new_zip->addFile($file)) {
print $file."was not added!<br />";
}
}
}
}
$new_zip->close();
?>
if you are echoing out the output and confused about the number...maybe this will help. i'm not totally sure it is accurate though.
ZIPARCHIVE::ER_EXISTS - 10
ZIPARCHIVE::ER_INCONS - 21
ZIPARCHIVE::ER_INVAL - 18
ZIPARCHIVE::ER_MEMORY - 14
ZIPARCHIVE::ER_NOENT - 9
ZIPARCHIVE::ER_NOZIP - 19
ZIPARCHIVE::ER_OPEN - 11
ZIPARCHIVE::ER_READ - 5
ZIPARCHIVE::ER_SEEK - 4
With php 5.2.6, the following code created a new zip or replaced a existing zip.
Note that I am only using the ZIPARCHIVE::OVERWRITE flag.
<?php
$zip = new ZipArchive();
$opened = $zip->open( $zipFileName, ZIPARCHIVE::OVERWRITE );
if( $opened !== true ){
die("cannot open {$zipFileName} for writing.");
}
$zip->addFromString( $name, $contents );
$zip->close();
?>
Now, with php 5.2.8, it does not work and gives this warning:
Warning: ZipArchive::addFromString() [ziparchive.addfromstring]: Invalid or unitialized Zip object in [myfile] on line [myline]
To fix this, you must specify the flags as create or overwrite.
<?php
$zip = new ZipArchive();
$opened = $zip->open( $zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE );
if( $opened !== true ){
die("cannot open {$zipFileName} for writing.");
}
$zip->addFromString( $name, $contents );
$zip->close();
?>
When googling for the error message I found a lot of people that had it but couldn't figure out why they were getting it.
I hope this helps someone.
to anyone getting an error ZIPARCHIVE::ER_READ = 5, when
doing $zip->open($zipfile) with a ZIP file containing a total of more then (around) 800 files (even when they are in sub-directories).
possibly related bugs 40873, 8714:
1. it was not an OS limit, because it worked when called from windows via samba on the same file at the same place
2. it wasn't working under 32bit linux
with php 5.3.0 the issue seems to be resolved.
Further to what rickky at gmail dot com was saying, I've had that problem while trying to cache zip files and found that I had to set the permissions of the containing folder to 777 to get it to work.
Because this is a potential security weakness if on a public viewable folder, I'd recommend moving the folder so that it is no longer within public_html. You can then use readfile() to output the archive to the browser, with some HTTP headers to tell the browser it is a zip file.
As discussed in http://bugs.php.net/bug.php?id=54128 on Windows Server systems (2003, 2008) and IIS there is a problem when you want to unzip file stored in C:\Windows\Temp folder.
User of worker process IUSR_XXX has no directory listing right for C:\Windows\Temp and this is a reason why ZipArchive::open() fails with error 11 (error open). So it is not a good idea to store file for unzipping in folder defined by sys_get_temp_dir().
Even though the api specifies that the flags are optional I found that I had to specify the flag ZIPARCHIVE::CREATE for an archive to be opened.
This is on a Windows 7 system with PHP 5.3.0
Most of the time people iterate over a directory with 'opendir' or 'readdir' to add files to a zip. Like...
while ($file = readdir($dir)) { ... $zip->addFile($file) }
Note that $zip->addFile($file) will only work in the current directory if your at the root. You will need to add the correct path to that $file string variable to have the full file name like ...
$zip->addFile($dir . DIRECTORY_SEPARATOR . $file); will work.
This may identify why you may get a read error when closing the file.
Enjoy.