5 * Copyright (c) 2006 - 2014 PHPExcel
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 * @package PHPExcel_Shared_ZipArchive
23 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
24 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
25 * @version ##VERSION##, ##DATE##
28 if (!defined('PCLZIP_TEMPORARY_DIR')) {
29 define('PCLZIP_TEMPORARY_DIR', PHPExcel_Shared_File
::sys_get_temp_dir() . DIRECTORY_SEPARATOR
);
31 require_once PHPEXCEL_ROOT
. 'PHPExcel/Shared/PCLZip/pclzip.lib.php';
35 * PHPExcel_Shared_ZipArchive
38 * @package PHPExcel_Shared_ZipArchive
39 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
41 class PHPExcel_Shared_ZipArchive
45 const OVERWRITE
= 'OVERWRITE';
46 const CREATE
= 'CREATE';
50 * Temporary storage directory
57 * Zip Archive Stream Handle
65 * Open a new zip archive
67 * @param string $fileName Filename for the zip archive
70 public function open($fileName)
72 $this->_tempDir
= PHPExcel_Shared_File
::sys_get_temp_dir();
74 $this->_zip
= new PclZip($fileName);
81 * Close this zip archive
84 public function close()
90 * Add a new file to the zip archive from a string of raw data.
92 * @param string $localname Directory/Name of the file to add to the zip archive
93 * @param string $contents String of data to add to the zip archive
95 public function addFromString($localname, $contents)
97 $filenameParts = pathinfo($localname);
99 $handle = fopen($this->_tempDir
.'/'.$filenameParts["basename"], "wb");
100 fwrite($handle, $contents);
103 $res = $this->_zip
->add($this->_tempDir
.'/'.$filenameParts["basename"],
104 PCLZIP_OPT_REMOVE_PATH
, $this->_tempDir
,
105 PCLZIP_OPT_ADD_PATH
, $filenameParts["dirname"]
108 throw new PHPExcel_Writer_Exception("Error zipping files : " . $this->_zip
->errorInfo(true));
111 unlink($this->_tempDir
.'/'.$filenameParts["basename"]);
115 * Find if given fileName exist in archive (Emulate ZipArchive locateName())
117 * @param string $fileName Filename for the file in zip archive
120 public function locateName($fileName)
122 $list = $this->_zip
->listContent();
123 $listCount = count($list);
125 for ($i = 0; $i < $listCount; ++
$i) {
126 if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
127 strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
132 return ($list_index > -1);
136 * Extract file from archive by given fileName (Emulate ZipArchive getFromName())
138 * @param string $fileName Filename for the file in zip archive
139 * @return string $contents File string contents
141 public function getFromName($fileName)
143 $list = $this->_zip
->listContent();
144 $listCount = count($list);
146 for ($i = 0; $i < $listCount; ++
$i) {
147 if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
148 strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
155 if ($list_index != -1) {
156 $extracted = $this->_zip
->extractByIndex($list_index, PCLZIP_OPT_EXTRACT_AS_STRING
);
158 $filename = substr($fileName, 1);
160 for ($i = 0; $i < $listCount; ++
$i) {
161 if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
162 strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
167 $extracted = $this->_zip
->extractByIndex($list_index, PCLZIP_OPT_EXTRACT_AS_STRING
);
169 if ((is_array($extracted)) && ($extracted != 0)) {
170 $contents = $extracted[0]["content"];