MediaWiki  REL1_22
FSFile.php
Go to the documentation of this file.
00001 <?php
00029 class FSFile {
00030     protected $path; // path to file
00031     protected $sha1Base36; // file SHA-1 in base 36
00032 
00039     public function __construct( $path ) {
00040         if ( FileBackend::isStoragePath( $path ) ) {
00041             throw new MWException( __METHOD__ . " given storage path `$path`." );
00042         }
00043         $this->path = $path;
00044     }
00045 
00051     public function getPath() {
00052         return $this->path;
00053     }
00054 
00060     public function exists() {
00061         return is_file( $this->path );
00062     }
00063 
00069     public function getSize() {
00070         return filesize( $this->path );
00071     }
00072 
00078     public function getTimestamp() {
00079         wfSuppressWarnings();
00080         $timestamp = filemtime( $this->path );
00081         wfRestoreWarnings();
00082         if ( $timestamp !== false ) {
00083             $timestamp = wfTimestamp( TS_MW, $timestamp );
00084         }
00085         return $timestamp;
00086     }
00087 
00093     public function getMimeType() {
00094         return MimeMagic::singleton()->guessMimeType( $this->path, false );
00095     }
00096 
00106     public function getProps( $ext = true ) {
00107         wfProfileIn( __METHOD__ );
00108         wfDebug( __METHOD__ . ": Getting file info for $this->path\n" );
00109 
00110         $info = self::placeholderProps();
00111         $info['fileExists'] = $this->exists();
00112 
00113         if ( $info['fileExists'] ) {
00114             $magic = MimeMagic::singleton();
00115 
00116             # get the file extension
00117             if ( $ext === true ) {
00118                 $ext = self::extensionFromPath( $this->path );
00119             }
00120 
00121             # mime type according to file contents
00122             $info['file-mime'] = $this->getMimeType();
00123             # logical mime type
00124             $info['mime'] = $magic->improveTypeFromExtension( $info['file-mime'], $ext );
00125 
00126             list( $info['major_mime'], $info['minor_mime'] ) = File::splitMime( $info['mime'] );
00127             $info['media_type'] = $magic->getMediaType( $this->path, $info['mime'] );
00128 
00129             # Get size in bytes
00130             $info['size'] = $this->getSize();
00131 
00132             # Height, width and metadata
00133             $handler = MediaHandler::getHandler( $info['mime'] );
00134             if ( $handler ) {
00135                 $tempImage = (object)array(); // XXX (hack for File object)
00136                 $info['metadata'] = $handler->getMetadata( $tempImage, $this->path );
00137                 $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] );
00138                 if ( is_array( $gis ) ) {
00139                     $info = $this->extractImageSizeInfo( $gis ) + $info;
00140                 }
00141             }
00142             $info['sha1'] = $this->getSha1Base36();
00143 
00144             wfDebug( __METHOD__ . ": $this->path loaded, {$info['size']} bytes, {$info['mime']}.\n" );
00145         } else {
00146             wfDebug( __METHOD__ . ": $this->path NOT FOUND!\n" );
00147         }
00148 
00149         wfProfileOut( __METHOD__ );
00150         return $info;
00151     }
00152 
00158     public static function placeholderProps() {
00159         $info = array();
00160         $info['fileExists'] = false;
00161         $info['mime'] = null;
00162         $info['media_type'] = MEDIATYPE_UNKNOWN;
00163         $info['metadata'] = '';
00164         $info['sha1'] = '';
00165         $info['width'] = 0;
00166         $info['height'] = 0;
00167         $info['bits'] = 0;
00168         return $info;
00169     }
00170 
00177     protected function extractImageSizeInfo( array $gis ) {
00178         $info = array();
00179         # NOTE: $gis[2] contains a code for the image type. This is no longer used.
00180         $info['width'] = $gis[0];
00181         $info['height'] = $gis[1];
00182         if ( isset( $gis['bits'] ) ) {
00183             $info['bits'] = $gis['bits'];
00184         } else {
00185             $info['bits'] = 0;
00186         }
00187         return $info;
00188     }
00189 
00200     public function getSha1Base36( $recache = false ) {
00201         wfProfileIn( __METHOD__ );
00202 
00203         if ( $this->sha1Base36 !== null && !$recache ) {
00204             wfProfileOut( __METHOD__ );
00205             return $this->sha1Base36;
00206         }
00207 
00208         wfSuppressWarnings();
00209         $this->sha1Base36 = sha1_file( $this->path );
00210         wfRestoreWarnings();
00211 
00212         if ( $this->sha1Base36 !== false ) {
00213             $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
00214         }
00215 
00216         wfProfileOut( __METHOD__ );
00217         return $this->sha1Base36;
00218     }
00219 
00226     public static function extensionFromPath( $path ) {
00227         $i = strrpos( $path, '.' );
00228         return strtolower( $i ? substr( $path, $i + 1 ) : '' );
00229     }
00230 
00239     public static function getPropsFromPath( $path, $ext = true ) {
00240         $fsFile = new self( $path );
00241         return $fsFile->getProps( $ext );
00242     }
00243 
00254     public static function getSha1Base36FromPath( $path ) {
00255         $fsFile = new self( $path );
00256         return $fsFile->getSha1Base36();
00257     }
00258 }