diff options
Diffstat (limited to 'kohana/helpers/file.php')
-rw-r--r-- | kohana/helpers/file.php | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/kohana/helpers/file.php b/kohana/helpers/file.php new file mode 100644 index 00000000..ebb2d97a --- /dev/null +++ b/kohana/helpers/file.php @@ -0,0 +1,186 @@ +<?php defined('SYSPATH') OR die('No direct access allowed.'); +/** + * File helper class. + * + * $Id$ + * + * @package Core + * @author Kohana Team + * @copyright (c) 2007-2008 Kohana Team + * @license http://kohanaphp.com/license.html + */ +class file_Core { + + /** + * Attempt to get the mime type from a file. This method is horribly + * unreliable, due to PHP being horribly unreliable when it comes to + * determining the mime-type of a file. + * + * @param string filename + * @return string mime-type, if found + * @return boolean FALSE, if not found + */ + public static function mime($filename) + { + // Make sure the file is readable + if ( ! (is_file($filename) AND is_readable($filename))) + return FALSE; + + // Get the extension from the filename + $extension = strtolower(substr(strrchr($filename, '.'), 1)); + + if (preg_match('/^(?:jpe?g|png|[gt]if|bmp|swf)$/', $extension)) + { + // Disable error reporting + $ER = error_reporting(0); + + // Use getimagesize() to find the mime type on images + $mime = getimagesize($filename); + + // Turn error reporting back on + error_reporting($ER); + + // Return the mime type + if (isset($mime['mime'])) + return $mime['mime']; + } + + if (function_exists('finfo_open')) + { + // Use the fileinfo extension + $finfo = finfo_open(FILEINFO_MIME); + $mime = finfo_file($finfo, $filename); + finfo_close($finfo); + + // Return the mime type + return $mime; + } + + if (ini_get('mime_magic.magicfile') AND function_exists('mime_content_type')) + { + // Return the mime type using mime_content_type + return mime_content_type($filename); + } + + if ( ! KOHANA_IS_WIN) + { + // Attempt to locate use the file command, checking the return value + if ($command = trim(exec('which file', $output, $return)) AND $return === 0) + { + return trim(exec($command.' -bi '.escapeshellarg($filename))); + } + } + + if ( ! empty($extension) AND is_array($mime = Kohana::config('mimes.'.$extension))) + { + // Return the mime-type guess, based on the extension + return $mime[0]; + } + + // Unable to find the mime-type + return FALSE; + } + + /** + * Split a file into pieces matching a specific size. + * + * @param string file to be split + * @param string directory to output to, defaults to the same directory as the file + * @param integer size, in MB, for each chunk to be + * @return integer The number of pieces that were created. + */ + public static function split($filename, $output_dir = FALSE, $piece_size = 10) + { + // Find output dir + $output_dir = ($output_dir == FALSE) ? pathinfo(str_replace('\\', '/', realpath($filename)), PATHINFO_DIRNAME) : str_replace('\\', '/', realpath($output_dir)); + $output_dir = rtrim($output_dir, '/').'/'; + + // Open files for writing + $input_file = fopen($filename, 'rb'); + + // Change the piece size to bytes + $piece_size = 1024 * 1024 * (int) $piece_size; // Size in bytes + + // Set up reading variables + $read = 0; // Number of bytes read + $piece = 1; // Current piece + $chunk = 1024 * 8; // Chunk size to read + + // Split the file + while ( ! feof($input_file)) + { + // Open a new piece + $piece_name = $filename.'.'.str_pad($piece, 3, '0', STR_PAD_LEFT); + $piece_open = @fopen($piece_name, 'wb+') or die('Could not write piece '.$piece_name); + + // Fill the current piece + while ($read < $piece_size AND $data = fread($input_file, $chunk)) + { + fwrite($piece_open, $data) or die('Could not write to open piece '.$piece_name); + $read += $chunk; + } + + // Close the current piece + fclose($piece_open); + + // Prepare to open a new piece + $read = 0; + $piece++; + + // Make sure that piece is valid + ($piece < 999) or die('Maximum of 999 pieces exceeded, try a larger piece size'); + } + + // Close input file + fclose($input_file); + + // Returns the number of pieces that were created + return ($piece - 1); + } + + /** + * Join a split file into a whole file. + * + * @param string split filename, without .000 extension + * @param string output filename, if different then an the filename + * @return integer The number of pieces that were joined. + */ + public static function join($filename, $output = FALSE) + { + if ($output == FALSE) + $output = $filename; + + // Set up reading variables + $piece = 1; // Current piece + $chunk = 1024 * 8; // Chunk size to read + + // Open output file + $output_file = @fopen($output, 'wb+') or die('Could not open output file '.$output); + + // Read each piece + while ($piece_open = @fopen(($piece_name = $filename.'.'.str_pad($piece, 3, '0', STR_PAD_LEFT)), 'rb')) + { + // Write the piece into the output file + while ( ! feof($piece_open)) + { + fwrite($output_file, fread($piece_open, $chunk)); + } + + // Close the current piece + fclose($piece_open); + + // Prepare for a new piece + $piece++; + + // Make sure piece is valid + ($piece < 999) or die('Maximum of 999 pieces exceeded'); + } + + // Close the output file + fclose($output_file); + + // Return the number of pieces joined + return ($piece - 1); + } + +} // End file
\ No newline at end of file |