1: <?php
2: /**
3: * PHPExcel
4: *
5: * Copyright (c) 2006 - 2014 PHPExcel
6: *
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.
11: *
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.
16: *
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
20: *
21: * @category PHPExcel
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 1.8.0, 2014-03-02
26: */
27:
28: if (!defined('PCLZIP_TEMPORARY_DIR')) {
29: define('PCLZIP_TEMPORARY_DIR', PHPExcel_Shared_File::sys_get_temp_dir());
30: }
31: require_once PHPEXCEL_ROOT . 'PHPExcel/Shared/PCLZip/pclzip.lib.php';
32:
33:
34: /**
35: * PHPExcel_Shared_ZipArchive
36: *
37: * @category PHPExcel
38: * @package PHPExcel_Shared_ZipArchive
39: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
40: */
41: class PHPExcel_Shared_ZipArchive
42: {
43:
44: /** constants */
45: const OVERWRITE = 'OVERWRITE';
46: const CREATE = 'CREATE';
47:
48:
49: /**
50: * Temporary storage directory
51: *
52: * @var string
53: */
54: private $_tempDir;
55:
56: /**
57: * Zip Archive Stream Handle
58: *
59: * @var string
60: */
61: private $_zip;
62:
63:
64: /**
65: * Open a new zip archive
66: *
67: * @param string $fileName Filename for the zip archive
68: * @return boolean
69: */
70: public function open($fileName)
71: {
72: $this->_tempDir = PHPExcel_Shared_File::sys_get_temp_dir();
73:
74: $this->_zip = new PclZip($fileName);
75:
76: return true;
77: }
78:
79:
80: /**
81: * Close this zip archive
82: *
83: */
84: public function close()
85: {
86: }
87:
88:
89: /**
90: * Add a new file to the zip archive from a string of raw data.
91: *
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
94: */
95: public function addFromString($localname, $contents)
96: {
97: $filenameParts = pathinfo($localname);
98:
99: $handle = fopen($this->_tempDir.'/'.$filenameParts["basename"], "wb");
100: fwrite($handle, $contents);
101: fclose($handle);
102:
103: $res = $this->_zip->add($this->_tempDir.'/'.$filenameParts["basename"],
104: PCLZIP_OPT_REMOVE_PATH, $this->_tempDir,
105: PCLZIP_OPT_ADD_PATH, $filenameParts["dirname"]
106: );
107: if ($res == 0) {
108: throw new PHPExcel_Writer_Exception("Error zipping files : " . $this->_zip->errorInfo(true));
109: }
110:
111: unlink($this->_tempDir.'/'.$filenameParts["basename"]);
112: }
113:
114: /**
115: * Find if given fileName exist in archive (Emulate ZipArchive locateName())
116: *
117: * @param string $fileName Filename for the file in zip archive
118: * @return boolean
119: */
120: public function locateName($fileName)
121: {
122: $list = $this->_zip->listContent();
123: $listCount = count($list);
124: $list_index = -1;
125: for ($i = 0; $i < $listCount; ++$i) {
126: if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
127: strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
128: $list_index = $i;
129: break;
130: }
131: }
132: return ($list_index > -1);
133: }
134:
135: /**
136: * Extract file from archive by given fileName (Emulate ZipArchive getFromName())
137: *
138: * @param string $fileName Filename for the file in zip archive
139: * @return string $contents File string contents
140: */
141: public function getFromName($fileName)
142: {
143: $list = $this->_zip->listContent();
144: $listCount = count($list);
145: $list_index = -1;
146: for ($i = 0; $i < $listCount; ++$i) {
147: if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
148: strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
149: $list_index = $i;
150: break;
151: }
152: }
153:
154: $extracted = "";
155: if ($list_index != -1) {
156: $extracted = $this->_zip->extractByIndex($list_index, PCLZIP_OPT_EXTRACT_AS_STRING);
157: } else {
158: $filename = substr($fileName, 1);
159: $list_index = -1;
160: for ($i = 0; $i < $listCount; ++$i) {
161: if (strtolower($list[$i]["filename"]) == strtolower($fileName) ||
162: strtolower($list[$i]["stored_filename"]) == strtolower($fileName)) {
163: $list_index = $i;
164: break;
165: }
166: }
167: $extracted = $this->_zip->extractByIndex($list_index, PCLZIP_OPT_EXTRACT_AS_STRING);
168: }
169: if ((is_array($extracted)) && ($extracted != 0)) {
170: $contents = $extracted[0]["content"];
171: }
172:
173: return $contents;
174: }
175: }
176: