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
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:
29: /**
30: * PHPExcel_Shared_File
31: *
32: * @category PHPExcel
33: * @package PHPExcel_Shared
34: * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
35: */
36: class PHPExcel_Shared_File
37: {
38: /*
39: * Use Temp or File Upload Temp for temporary files
40: *
41: * @protected
42: * @var boolean
43: */
44: protected static $_useUploadTempDirectory = FALSE;
45:
46:
47: /**
48: * Set the flag indicating whether the File Upload Temp directory should be used for temporary files
49: *
50: * @param boolean $useUploadTempDir Use File Upload Temporary directory (true or false)
51: */
52: public static function setUseUploadTempDirectory($useUploadTempDir = FALSE) {
53: self::$_useUploadTempDirectory = (boolean) $useUploadTempDir;
54: } // function setUseUploadTempDirectory()
55:
56:
57: /**
58: * Get the flag indicating whether the File Upload Temp directory should be used for temporary files
59: *
60: * @return boolean Use File Upload Temporary directory (true or false)
61: */
62: public static function getUseUploadTempDirectory() {
63: return self::$_useUploadTempDirectory;
64: } // function getUseUploadTempDirectory()
65:
66:
67: /**
68: * Verify if a file exists
69: *
70: * @param string $pFilename Filename
71: * @return bool
72: */
73: public static function file_exists($pFilename) {
74: // Sick construction, but it seems that
75: // file_exists returns strange values when
76: // doing the original file_exists on ZIP archives...
77: if ( strtolower(substr($pFilename, 0, 3)) == 'zip' ) {
78: // Open ZIP file and verify if the file exists
79: $zipFile = substr($pFilename, 6, strpos($pFilename, '#') - 6);
80: $archiveFile = substr($pFilename, strpos($pFilename, '#') + 1);
81:
82: $zip = new ZipArchive();
83: if ($zip->open($zipFile) === true) {
84: $returnValue = ($zip->getFromName($archiveFile) !== false);
85: $zip->close();
86: return $returnValue;
87: } else {
88: return false;
89: }
90: } else {
91: // Regular file_exists
92: return file_exists($pFilename);
93: }
94: }
95:
96: /**
97: * Returns canonicalized absolute pathname, also for ZIP archives
98: *
99: * @param string $pFilename
100: * @return string
101: */
102: public static function realpath($pFilename) {
103: // Returnvalue
104: $returnValue = '';
105:
106: // Try using realpath()
107: if (file_exists($pFilename)) {
108: $returnValue = realpath($pFilename);
109: }
110:
111: // Found something?
112: if ($returnValue == '' || ($returnValue === NULL)) {
113: $pathArray = explode('/' , $pFilename);
114: while(in_array('..', $pathArray) && $pathArray[0] != '..') {
115: for ($i = 0; $i < count($pathArray); ++$i) {
116: if ($pathArray[$i] == '..' && $i > 0) {
117: unset($pathArray[$i]);
118: unset($pathArray[$i - 1]);
119: break;
120: }
121: }
122: }
123: $returnValue = implode('/', $pathArray);
124: }
125:
126: // Return
127: return $returnValue;
128: }
129:
130: /**
131: * Get the systems temporary directory.
132: *
133: * @return string
134: */
135: public static function sys_get_temp_dir()
136: {
137: if (self::$_useUploadTempDirectory) {
138: // use upload-directory when defined to allow running on environments having very restricted
139: // open_basedir configs
140: if (ini_get('upload_tmp_dir') !== FALSE) {
141: if ($temp = ini_get('upload_tmp_dir')) {
142: if (file_exists($temp))
143: return realpath($temp);
144: }
145: }
146: }
147:
148: // sys_get_temp_dir is only available since PHP 5.2.1
149: // http://php.net/manual/en/function.sys-get-temp-dir.php#94119
150: if ( !function_exists('sys_get_temp_dir')) {
151: if ($temp = getenv('TMP') ) {
152: if ((!empty($temp)) && (file_exists($temp))) { return realpath($temp); }
153: }
154: if ($temp = getenv('TEMP') ) {
155: if ((!empty($temp)) && (file_exists($temp))) { return realpath($temp); }
156: }
157: if ($temp = getenv('TMPDIR') ) {
158: if ((!empty($temp)) && (file_exists($temp))) { return realpath($temp); }
159: }
160:
161: // trick for creating a file in system's temporary dir
162: // without knowing the path of the system's temporary dir
163: $temp = tempnam(__FILE__, '');
164: if (file_exists($temp)) {
165: unlink($temp);
166: return realpath(dirname($temp));
167: }
168:
169: return null;
170: }
171:
172: // use ordinary built-in PHP function
173: // There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only
174: // be called if we're running 5.2.1 or earlier
175: return realpath(sys_get_temp_dir());
176: }
177:
178: }
179: