Source for file jFile.class.php

Documentation is available at jFile.class.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage utils
  5. @author Laurent Jouanneau
  6. @contributor Thiriot Christophe
  7. @contributor Bastien Jaillot
  8. @contributor Loic Mathaud
  9. @contributor Foxmask (#733)
  10. @contributor Cedric (fix bug ticket 56)
  11. @contributor Julien Issler
  12. @copyright   2005-2011 Laurent Jouanneau, 2006 Thiriot Christophe, 2006 Loic Mathaud, 2008 Bastien Jaillot, 2008 Foxmask, 2009 Julien Issler
  13. @link        http://www.jelix.org
  14. @licence  http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public Licence, see LICENCE file
  15. */
  16.  
  17.  
  18. /**
  19.  * A class helper to read or create files
  20.  * @package    jelix
  21.  * @subpackage utils
  22.  */
  23. class jFile {
  24.     /**
  25.     * Reads the content of a file.
  26.     * @param string $filename the filename we're gonna read
  27.     * @return string the content of the file. false if cannot read the file
  28.     */
  29.     public static function read ($filename){
  30.         return @file_get_contents ($filenamefalse);
  31.     }
  32.  
  33.     /**
  34.     * Write a file to the disk.
  35.     * This function is heavily based on the way smarty process its own files.
  36.     * Is using a temporary file and then rename the file. We guess the file system will be smarter than us, avoiding a writing / reading
  37.     *  while renaming the file.
  38.     * This method comes from CopixFile class of Copix framework
  39.     * @author     Croes GĂ©rald
  40.     * @copyright  2001-2005 CopixTeam
  41.     * @link http://www.copix.org
  42.     */
  43.     public static function write ($file$data){
  44.         $_dirname dirname($file);
  45.  
  46.         //asking to create the directory structure if needed.
  47.         self::createDir ($_dirname);
  48.  
  49.         if(!@is_writable($_dirname)) {
  50.             // cache_dir not writable, see if it exists
  51.             if(!@is_dir($_dirname)) {
  52.                 throw new jException('jelix~errors.file.directory.notexists'array ($_dirname));
  53.             }
  54.             throw new jException('jelix~errors.file.directory.notwritable'array ($file$_dirname));
  55.         }
  56.  
  57.         // write to tmp file, then rename it to avoid
  58.         // file locking race condition
  59.         $_tmp_file tempnam($_dirname'wrt');
  60.  
  61.         if (!($fd @fopen($_tmp_file'wb'))) {
  62.             $_tmp_file $_dirname '/' uniqid('wrt');
  63.             if (!($fd @fopen($_tmp_file'wb'))) {
  64.                 throw new jException('jelix~errors.file.write.error'array ($file$_tmp_file));
  65.             }
  66.         }
  67.  
  68.         fwrite($fd$data);
  69.         fclose($fd);
  70.  
  71.         // Delete the file if it allready exists (this is needed on Win,
  72.         // because it cannot overwrite files with rename()
  73.         if ($GLOBALS['gJConfig']->isWindows && file_exists($file)) {
  74.             unlink($file);
  75.         }
  76.         rename($_tmp_file$file);
  77.         @chmod($file,  0664);
  78.  
  79.         return true;
  80.     }
  81.  
  82.     /**
  83.     * create a directory
  84.     * It creates also all necessary parent directory
  85.     * @param string $dir the path of the directory
  86.     */
  87.     public static function createDir ($dir){
  88.         // recursive feature on mkdir() is broken with PHP 5.0.4 for Windows
  89.         // so should do own recursion
  90.         if (!file_exists($dir)) {
  91.             self::createDir(dirname($dir));
  92.             mkdir($dir0775);
  93.         }
  94.     }
  95.  
  96.     /**
  97.      * Recursive function deleting a directory
  98.      *
  99.      * @param string $path The path of the directory to remove recursively
  100.      * @param boolean $deleteParent If the path must be deleted too
  101.      * @since 1.0b1
  102.      * @author Loic Mathaud
  103.      */
  104.     public static function removeDir($path$deleteParent=true{
  105.  
  106.         if($path == '' || $path == '/' || $path == DIRECTORY_SEPARATOR)
  107.             throw new jException('jelix~errors.file.directory.cannot.remove.fs.root')//see ticket #840
  108.  
  109.         $dir new DirectoryIterator($path);
  110.         foreach ($dir as $dirContent{
  111.             // file deletion
  112.             if ($dirContent->isFile(|| $dirContent->isLink()) {
  113.                 unlink($dirContent->getPathName());
  114.             else {
  115.                 // recursive directory deletion
  116.                 if (!$dirContent->isDot(&& $dirContent->isDir()) {
  117.                     self::removeDir($dirContent->getPathName());
  118.                 }
  119.             }
  120.         }
  121.         unset($dir)// see bug #733
  122.         unset($dirContent);
  123.  
  124.         // removes the parent directory
  125.         if ($deleteParent{
  126.             rmdir($path);
  127.         }
  128.     }
  129.  
  130.     /**
  131.      * get the MIME Type of a file
  132.      *
  133.      * @param string $file The full path of the file
  134.      * @return string the MIME type of the file
  135.      * @since 1.1.6
  136.      */
  137.     public static function getMimeType($file){
  138.         if (function_exists('finfo_open')) {
  139.             $finfo finfo_open(FILEINFO_MIME_TYPE);
  140.             $type finfo_file($finfo$file);
  141.             finfo_close($finfo);
  142.             return $type;
  143.         }
  144.         else if (function_exists('mime_content_type')) {
  145.             return mime_content_type($file);
  146.         }
  147.         else {
  148.             // we know that it is not the ideal way to do it
  149.             // but don't want to spent time and resource to guess
  150.             // it from the file content.
  151.             return self::getMimeTypeFromFilename($file);
  152.         }
  153.     }
  154.  
  155.     /**
  156.      * get the MIME Type of a file, only with its name
  157.      *
  158.      * @param string $fileName the file name
  159.      * @return string the MIME type of the file
  160.      * @since 1.1.10
  161.      */
  162.     public static function getMimeTypeFromFilename($fileName){
  163.         $f explode('.'$fileName);
  164.         $ext strtolower(array_pop($f));
  165.         if (array_key_exists($extself::$mimeTypes)) {
  166.             return self::$mimeTypes[$ext];
  167.         }
  168.         else
  169.             return 'application/octet-stream';
  170.     }
  171.  
  172.     protected static $mimeTypes array(
  173.  
  174.         'txt' => 'text/plain',
  175.         'htm' => 'text/html',
  176.         'html' => 'text/html',
  177.         'xhtml' => 'application/xhtml+xml',
  178.         'xht' => 'application/xhtml+xml',
  179.         'php' => 'text/html',
  180.         'css' => 'text/css',
  181.         'js' => 'application/javascript',
  182.         'json' => 'application/json',
  183.         'xml' => 'application/xml',
  184.         'xslt' => 'application/xslt+xml',
  185.         'xsl' => 'application/xml',
  186.         'dtd' => 'application/xml-dtd',
  187.         'atom'=>'application/atom+xml',
  188.         'mathml'=>'application/mathml+xml',
  189.         'rdf'=>'application/rdf+xml',
  190.         'smi'=>'application/smil',
  191.         'smil'=>'application/smil',
  192.         'vxml'=>'application/voicexml+xml',
  193.         'latex'=>'application/x-latex',
  194.         'tcl'=>'application/x-tcl',
  195.         'tex'=>'application/x-tex',
  196.         'texinfo'=>'application/x-texinfo',
  197.         'wrl'=>'model/vrml',
  198.         'wrml'=>'model/vrml',
  199.         'ics'=>'text/calendar',
  200.         'ifb'=>'text/calendar',
  201.         'sgml'=>'text/sgml',
  202.         'htc'=>'text/x-component',
  203.  
  204.         // images
  205.         'png' => 'image/png',
  206.         'jpe' => 'image/jpeg',
  207.         'jpeg' => 'image/jpeg',
  208.         'jpg' => 'image/jpeg',
  209.         'gif' => 'image/gif',
  210.         'bmp' => 'image/bmp',
  211.         'ico' => 'image/x-icon',
  212.         'tiff' => 'image/tiff',
  213.         'tif' => 'image/tiff',
  214.         'svg' => 'image/svg+xml',
  215.         'svgz' => 'image/svg+xml',
  216.         'djvu' => 'image/vnd.djvu',
  217.         'djv'  => 'image/vnd.djvu',
  218.  
  219.         // archives
  220.         'zip' => 'application/zip',
  221.         'rar' => 'application/x-rar-compressed',
  222.         'exe' => 'application/x-msdownload',
  223.         'msi' => 'application/x-msdownload',
  224.         'cab' => 'application/vnd.ms-cab-compressed',
  225.         'tar' => 'application/x-tar',
  226.         'gz'  => 'application/x-gzip',
  227.         'tgz'  => 'application/x-gzip',
  228.  
  229.         // audio/video
  230.         'mp2' => 'audio/mpeg',
  231.         'mp3' => 'audio/mpeg',
  232.         'qt' => 'video/quicktime',
  233.         'mov' => 'video/quicktime',
  234.         'mpeg' => 'video/mpeg',
  235.         'mpg' => 'video/mpeg',
  236.         'mpe' => 'video/mpeg',
  237.         'wav' => 'audio/wav',
  238.         'aiff' => 'audio/aiff',
  239.         'aif' => 'audio/aiff',
  240.         'avi' => 'video/msvideo',
  241.         'wmv' => 'video/x-ms-wmv',
  242.         'ogg' => 'application/ogg',
  243.         'flv' => 'video/x-flv',
  244.         'dvi' => 'application/x-dvi',
  245.         'au'=> 'audio/basic',
  246.         'snd'=> 'audio/basic',
  247.         'mid' => 'audio/midi',
  248.         'midi' => 'audio/midi',
  249.         'm3u' => 'audio/x-mpegurl',
  250.         'm4u' => 'video/vnd.mpegurl',
  251.         'ram' => 'audio/x-pn-realaudio',
  252.         'ra' => 'audio/x-pn-realaudio',
  253.         'rm' => 'application/vnd.rn-realmedia',
  254.  
  255.         // adobe
  256.         'pdf' => 'application/pdf',
  257.         'psd' => 'image/vnd.adobe.photoshop',
  258.         'ai' => 'application/postscript',
  259.         'eps' => 'application/postscript',
  260.         'ps' => 'application/postscript',
  261.         'swf' => 'application/x-shockwave-flash',
  262.  
  263.         // ms office
  264.         'doc' => 'application/msword',
  265.         'docx' => 'application/msword',
  266.         'rtf' => 'application/rtf',
  267.         'xls' => 'application/vnd.ms-excel',
  268.         'xlm' => 'application/vnd.ms-excel',
  269.         'xla' => 'application/vnd.ms-excel',
  270.         'xld' => 'application/vnd.ms-excel',
  271.         'xlt' => 'application/vnd.ms-excel',
  272.         'xlc' => 'application/vnd.ms-excel',
  273.         'xlw' => 'application/vnd.ms-excel',
  274.         'xll' => 'application/vnd.ms-excel',
  275.         'ppt' => 'application/vnd.ms-powerpoint',
  276.         'pps' => 'application/vnd.ms-powerpoint',
  277.  
  278.         // open office
  279.         'odt' => 'application/vnd.oasis.opendocument.text',
  280.         'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
  281.     );
  282.  
  283. }

Documentation generated on Thu, 22 Mar 2012 22:15:29 +0100 by phpDocumentor 1.4.3