MediaWiki REL1_28
File.php
Go to the documentation of this file.
1<?php
50abstract class File implements IDBAccessObject {
51 // Bitfield values akin to the Revision deletion constants
52 const DELETED_FILE = 1;
53 const DELETED_COMMENT = 2;
54 const DELETED_USER = 4;
56
58 const RENDER_NOW = 1;
63 const RENDER_FORCE = 2;
64
65 const DELETE_SOURCE = 1;
66
67 // Audience options for File::getDescription()
68 const FOR_PUBLIC = 1;
69 const FOR_THIS_USER = 2;
70 const RAW = 3;
71
72 // Options for File::thumbName()
73 const THUMB_FULL_NAME = 1;
74
95 public $repo;
96
98 protected $title;
99
101 protected $lastError;
102
104 protected $redirected;
105
108
110 protected $fsFile;
111
113 protected $handler;
114
116 protected $url;
117
119 protected $extension;
120
122 protected $name;
123
125 protected $path;
126
128 protected $hashPath;
129
133 protected $pageCount;
134
137
139 protected $redirectTitle;
140
142 protected $canRender;
143
147 protected $isSafeFile;
148
150 protected $repoClass = 'FileRepo';
151
154
165 function __construct( $title, $repo ) {
166 // Some subclasses do not use $title, but set name/title some other way
167 if ( $title !== false ) {
168 $title = self::normalizeTitle( $title, 'exception' );
169 }
170 $this->title = $title;
171 $this->repo = $repo;
172 }
173
183 static function normalizeTitle( $title, $exception = false ) {
184 $ret = $title;
185 if ( $ret instanceof Title ) {
186 # Normalize NS_MEDIA -> NS_FILE
187 if ( $ret->getNamespace() == NS_MEDIA ) {
188 $ret = Title::makeTitleSafe( NS_FILE, $ret->getDBkey() );
189 # Sanity check the title namespace
190 } elseif ( $ret->getNamespace() !== NS_FILE ) {
191 $ret = null;
192 }
193 } else {
194 # Convert strings to Title objects
195 $ret = Title::makeTitleSafe( NS_FILE, (string)$ret );
196 }
197 if ( !$ret && $exception !== false ) {
198 throw new MWException( "`$title` is not a valid file title." );
199 }
200
201 return $ret;
202 }
203
204 function __get( $name ) {
205 $function = [ $this, 'get' . ucfirst( $name ) ];
206 if ( !is_callable( $function ) ) {
207 return null;
208 } else {
209 $this->$name = call_user_func( $function );
210
211 return $this->$name;
212 }
213 }
214
223 static function normalizeExtension( $extension ) {
224 $lower = strtolower( $extension );
225 $squish = [
226 'htm' => 'html',
227 'jpeg' => 'jpg',
228 'mpeg' => 'mpg',
229 'tiff' => 'tif',
230 'ogv' => 'ogg' ];
231 if ( isset( $squish[$lower] ) ) {
232 return $squish[$lower];
233 } elseif ( preg_match( '/^[0-9a-z]+$/', $lower ) ) {
234 return $lower;
235 } else {
236 return '';
237 }
238 }
239
248 static function checkExtensionCompatibility( File $old, $new ) {
249 $oldMime = $old->getMimeType();
250 $n = strrpos( $new, '.' );
251 $newExt = self::normalizeExtension( $n ? substr( $new, $n + 1 ) : '' );
253
254 return $mimeMagic->isMatchingExtension( $newExt, $oldMime );
255 }
256
262 function upgradeRow() {
263 }
264
272 public static function splitMime( $mime ) {
273 if ( strpos( $mime, '/' ) !== false ) {
274 return explode( '/', $mime, 2 );
275 } else {
276 return [ $mime, 'unknown' ];
277 }
278 }
279
287 public static function compare( File $a, File $b ) {
288 return strcmp( $a->getName(), $b->getName() );
289 }
290
296 public function getName() {
297 if ( !isset( $this->name ) ) {
298 $this->assertRepoDefined();
299 $this->name = $this->repo->getNameFromTitle( $this->title );
300 }
301
302 return $this->name;
303 }
304
310 function getExtension() {
311 if ( !isset( $this->extension ) ) {
312 $n = strrpos( $this->getName(), '.' );
313 $this->extension = self::normalizeExtension(
314 $n ? substr( $this->getName(), $n + 1 ) : '' );
315 }
316
317 return $this->extension;
318 }
319
325 public function getTitle() {
326 return $this->title;
327 }
328
334 public function getOriginalTitle() {
335 if ( $this->redirected ) {
336 return $this->getRedirectedTitle();
337 }
338
339 return $this->title;
340 }
341
347 public function getUrl() {
348 if ( !isset( $this->url ) ) {
349 $this->assertRepoDefined();
350 $ext = $this->getExtension();
351 $this->url = $this->repo->getZoneUrl( 'public', $ext ) . '/' . $this->getUrlRel();
352 }
353
354 return $this->url;
355 }
356
357 /*
358 * Get short description URL for a files based on the page ID
359 *
360 * @return string|null
361 * @since 1.27
362 */
363 public function getDescriptionShortUrl() {
364 return null;
365 }
366
374 public function getFullUrl() {
375 return wfExpandUrl( $this->getUrl(), PROTO_RELATIVE );
376 }
377
381 public function getCanonicalUrl() {
382 return wfExpandUrl( $this->getUrl(), PROTO_CANONICAL );
383 }
384
388 function getViewURL() {
389 if ( $this->mustRender() ) {
390 if ( $this->canRender() ) {
391 return $this->createThumb( $this->getWidth() );
392 } else {
393 wfDebug( __METHOD__ . ': supposed to render ' . $this->getName() .
394 ' (' . $this->getMimeType() . "), but can't!\n" );
395
396 return $this->getUrl(); # hm... return NULL?
397 }
398 } else {
399 return $this->getUrl();
400 }
401 }
402
416 public function getPath() {
417 if ( !isset( $this->path ) ) {
418 $this->assertRepoDefined();
419 $this->path = $this->repo->getZonePath( 'public' ) . '/' . $this->getRel();
420 }
421
422 return $this->path;
423 }
424
432 public function getLocalRefPath() {
433 $this->assertRepoDefined();
434 if ( !isset( $this->fsFile ) ) {
435 $starttime = microtime( true );
436 $this->fsFile = $this->repo->getLocalReference( $this->getPath() );
437
438 $statTiming = microtime( true ) - $starttime;
439 RequestContext::getMain()->getStats()->timing(
440 'media.thumbnail.generate.fetchoriginal', 1000 * $statTiming );
441
442 if ( !$this->fsFile ) {
443 $this->fsFile = false; // null => false; cache negative hits
444 }
445 }
446
447 return ( $this->fsFile )
448 ? $this->fsFile->getPath()
449 : false;
450 }
451
462 public function getWidth( $page = 1 ) {
463 return false;
464 }
465
476 public function getHeight( $page = 1 ) {
477 return false;
478 }
479
489 public function getThumbnailBucket( $desiredWidth, $page = 1 ) {
491
492 $imageWidth = $this->getWidth( $page );
493
494 if ( $imageWidth === false ) {
495 return false;
496 }
497
498 if ( $desiredWidth > $imageWidth ) {
499 return false;
500 }
501
502 if ( !$wgThumbnailBuckets ) {
503 return false;
504 }
505
506 $sortedBuckets = $wgThumbnailBuckets;
507
508 sort( $sortedBuckets );
509
510 foreach ( $sortedBuckets as $bucket ) {
511 if ( $bucket >= $imageWidth ) {
512 return false;
513 }
514
515 if ( $bucket - $wgThumbnailMinimumBucketDistance > $desiredWidth ) {
516 return $bucket;
517 }
518 }
519
520 // Image is bigger than any available bucket
521 return false;
522 }
523
531 public function getUser( $type = 'text' ) {
532 return null;
533 }
534
540 public function getLength() {
541 $handler = $this->getHandler();
542 if ( $handler ) {
543 return $handler->getLength( $this );
544 } else {
545 return 0;
546 }
547 }
548
554 public function isVectorized() {
555 $handler = $this->getHandler();
556 if ( $handler ) {
557 return $handler->isVectorized( $this );
558 } else {
559 return false;
560 }
561 }
562
574 public function getAvailableLanguages() {
575 $handler = $this->getHandler();
576 if ( $handler ) {
577 return $handler->getAvailableLanguages( $this );
578 } else {
579 return [];
580 }
581 }
582
590 public function getDefaultRenderLanguage() {
591 $handler = $this->getHandler();
592 if ( $handler ) {
593 return $handler->getDefaultRenderLanguage( $this );
594 } else {
595 return null;
596 }
597 }
598
610 $handler = $this->getHandler();
611 if ( !$handler ) {
612 // We cannot handle image whatsoever, thus
613 // one would not expect it to be animated
614 // so true.
615 return true;
616 } else {
617 if ( $this->allowInlineDisplay()
618 && $handler->isAnimatedImage( $this )
619 && !$handler->canAnimateThumbnail( $this )
620 ) {
621 // Image is animated, but thumbnail isn't.
622 // This is unexpected to the user.
623 return false;
624 } else {
625 // Image is not animated, so one would
626 // not expect thumb to be
627 return true;
628 }
629 }
630 }
631
638 public function getMetadata() {
639 return false;
640 }
641
648 public function getCommonMetaArray() {
649 $handler = $this->getHandler();
650
651 if ( !$handler ) {
652 return false;
653 }
654
655 return $handler->getCommonMetaArray( $this );
656 }
657
666 public function convertMetadataVersion( $metadata, $version ) {
667 $handler = $this->getHandler();
668 if ( !is_array( $metadata ) ) {
669 // Just to make the return type consistent
670 $metadata = unserialize( $metadata );
671 }
672 if ( $handler ) {
673 return $handler->convertMetadataVersion( $metadata, $version );
674 } else {
675 return $metadata;
676 }
677 }
678
685 public function getBitDepth() {
686 return 0;
687 }
688
695 public function getSize() {
696 return false;
697 }
698
706 function getMimeType() {
707 return 'unknown/unknown';
708 }
709
717 function getMediaType() {
718 return MEDIATYPE_UNKNOWN;
719 }
720
733 function canRender() {
734 if ( !isset( $this->canRender ) ) {
735 $this->canRender = $this->getHandler() && $this->handler->canRender( $this ) && $this->exists();
736 }
737
738 return $this->canRender;
739 }
740
745 protected function getCanRender() {
746 return $this->canRender();
747 }
748
759 function mustRender() {
760 return $this->getHandler() && $this->handler->mustRender( $this );
761 }
762
769 return $this->canRender();
770 }
771
785 function isSafeFile() {
786 if ( !isset( $this->isSafeFile ) ) {
787 $this->isSafeFile = $this->getIsSafeFileUncached();
788 }
789
790 return $this->isSafeFile;
791 }
792
798 protected function getIsSafeFile() {
799 return $this->isSafeFile();
800 }
801
807 protected function getIsSafeFileUncached() {
809
810 if ( $this->allowInlineDisplay() ) {
811 return true;
812 }
813 if ( $this->isTrustedFile() ) {
814 return true;
815 }
816
817 $type = $this->getMediaType();
818 $mime = $this->getMimeType();
819 # wfDebug( "LocalFile::isSafeFile: type= $type, mime= $mime\n" );
820
821 if ( !$type || $type === MEDIATYPE_UNKNOWN ) {
822 return false; # unknown type, not trusted
823 }
824 if ( in_array( $type, $wgTrustedMediaFormats ) ) {
825 return true;
826 }
827
828 if ( $mime === "unknown/unknown" ) {
829 return false; # unknown type, not trusted
830 }
831 if ( in_array( $mime, $wgTrustedMediaFormats ) ) {
832 return true;
833 }
834
835 return false;
836 }
837
851 function isTrustedFile() {
852 # this could be implemented to check a flag in the database,
853 # look for signatures, etc
854 return false;
855 }
856
866 public function load( $flags = 0 ) {
867 }
868
876 public function exists() {
877 return $this->getPath() && $this->repo->fileExists( $this->path );
878 }
879
886 public function isVisible() {
887 return $this->exists();
888 }
889
894 if ( !isset( $this->transformScript ) ) {
895 $this->transformScript = false;
896 if ( $this->repo ) {
897 $script = $this->repo->getThumbScriptUrl();
898 if ( $script ) {
899 $this->transformScript = wfAppendQuery( $script, [ 'f' => $this->getName() ] );
900 }
901 }
902 }
903
905 }
906
915 $hp =& $handlerParams;
916 $page = isset( $hp['page'] ) ? $hp['page'] : false;
917 $width = $this->getWidth( $page );
918 if ( !$width ) {
919 return $this->iconThumb();
920 }
921 $hp['width'] = $width;
922 // be sure to ignore any height specification as well (bug 62258)
923 unset( $hp['height'] );
924
925 return $this->transform( $hp );
926 }
927
937 public function thumbName( $params, $flags = 0 ) {
938 $name = ( $this->repo && !( $flags & self::THUMB_FULL_NAME ) )
939 ? $this->repo->nameForThumb( $this->getName() )
940 : $this->getName();
941
942 return $this->generateThumbName( $name, $params );
943 }
944
952 public function generateThumbName( $name, $params ) {
953 if ( !$this->getHandler() ) {
954 return null;
955 }
956 $extension = $this->getExtension();
957 list( $thumbExt, ) = $this->getHandler()->getThumbType(
958 $extension, $this->getMimeType(), $params );
959 $thumbName = $this->getHandler()->makeParamString( $params );
960
961 if ( $this->repo->supportsSha1URLs() ) {
962 $thumbName .= '-' . $this->getSha1() . '.' . $thumbExt;
963 } else {
964 $thumbName .= '-' . $name;
965
966 if ( $thumbExt != $extension ) {
967 $thumbName .= ".$thumbExt";
968 }
969 }
970
971 return $thumbName;
972 }
973
991 public function createThumb( $width, $height = -1 ) {
992 $params = [ 'width' => $width ];
993 if ( $height != -1 ) {
994 $params['height'] = $height;
995 }
996 $thumb = $this->transform( $params );
997 if ( !$thumb || $thumb->isError() ) {
998 return '';
999 }
1000
1001 return $thumb->getUrl();
1002 }
1003
1013 protected function transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags ) {
1015
1016 $handler = $this->getHandler();
1017 if ( $handler && $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
1018 return $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
1019 } else {
1020 return new MediaTransformError( 'thumbnail_error',
1021 $params['width'], 0, wfMessage( 'thumbnail-dest-create' )->text() );
1022 }
1023 }
1024
1033 function transform( $params, $flags = 0 ) {
1035
1036 do {
1037 if ( !$this->canRender() ) {
1038 $thumb = $this->iconThumb();
1039 break; // not a bitmap or renderable image, don't try
1040 }
1041
1042 // Get the descriptionUrl to embed it as comment into the thumbnail. Bug 19791.
1043 $descriptionUrl = $this->getDescriptionUrl();
1044 if ( $descriptionUrl ) {
1045 $params['descriptionUrl'] = wfExpandUrl( $descriptionUrl, PROTO_CANONICAL );
1046 }
1047
1048 $handler = $this->getHandler();
1049 $script = $this->getTransformScript();
1050 if ( $script && !( $flags & self::RENDER_NOW ) ) {
1051 // Use a script to transform on client request, if possible
1052 $thumb = $handler->getScriptedTransform( $this, $script, $params );
1053 if ( $thumb ) {
1054 break;
1055 }
1056 }
1057
1058 $normalisedParams = $params;
1059 $handler->normaliseParams( $this, $normalisedParams );
1060
1061 $thumbName = $this->thumbName( $normalisedParams );
1062 $thumbUrl = $this->getThumbUrl( $thumbName );
1063 $thumbPath = $this->getThumbPath( $thumbName ); // final thumb path
1064
1065 if ( $this->repo ) {
1066 // Defer rendering if a 404 handler is set up...
1067 if ( $this->repo->canTransformVia404() && !( $flags & self::RENDER_NOW ) ) {
1068 // XXX: Pass in the storage path even though we are not rendering anything
1069 // and the path is supposed to be an FS path. This is due to getScalerType()
1070 // getting called on the path and clobbering $thumb->getUrl() if it's false.
1071 $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
1072 break;
1073 }
1074 // Check if an up-to-date thumbnail already exists...
1075 wfDebug( __METHOD__ . ": Doing stat for $thumbPath\n" );
1076 if ( !( $flags & self::RENDER_FORCE ) && $this->repo->fileExists( $thumbPath ) ) {
1077 $timestamp = $this->repo->getFileTimestamp( $thumbPath );
1078 if ( $timestamp !== false && $timestamp >= $wgThumbnailEpoch ) {
1079 // XXX: Pass in the storage path even though we are not rendering anything
1080 // and the path is supposed to be an FS path. This is due to getScalerType()
1081 // getting called on the path and clobbering $thumb->getUrl() if it's false.
1082 $thumb = $handler->getTransform( $this, $thumbPath, $thumbUrl, $params );
1083 $thumb->setStoragePath( $thumbPath );
1084 break;
1085 }
1086 } elseif ( $flags & self::RENDER_FORCE ) {
1087 wfDebug( __METHOD__ . " forcing rendering per flag File::RENDER_FORCE\n" );
1088 }
1089
1090 // If the backend is ready-only, don't keep generating thumbnails
1091 // only to return transformation errors, just return the error now.
1092 if ( $this->repo->getReadOnlyReason() !== false ) {
1093 $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
1094 break;
1095 }
1096 }
1097
1098 $tmpFile = $this->makeTransformTmpFile( $thumbPath );
1099
1100 if ( !$tmpFile ) {
1101 $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags );
1102 } else {
1103 $thumb = $this->generateAndSaveThumb( $tmpFile, $params, $flags );
1104 }
1105 } while ( false );
1106
1107 return is_object( $thumb ) ? $thumb : false;
1108 }
1109
1117 public function generateAndSaveThumb( $tmpFile, $transformParams, $flags ) {
1119
1120 $stats = RequestContext::getMain()->getStats();
1121
1122 $handler = $this->getHandler();
1123
1124 $normalisedParams = $transformParams;
1125 $handler->normaliseParams( $this, $normalisedParams );
1126
1127 $thumbName = $this->thumbName( $normalisedParams );
1128 $thumbUrl = $this->getThumbUrl( $thumbName );
1129 $thumbPath = $this->getThumbPath( $thumbName ); // final thumb path
1130
1131 $tmpThumbPath = $tmpFile->getPath();
1132
1133 if ( $handler->supportsBucketing() ) {
1134 $this->generateBucketsIfNeeded( $normalisedParams, $flags );
1135 }
1136
1137 $starttime = microtime( true );
1138
1139 // Actually render the thumbnail...
1140 $thumb = $handler->doTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
1141 $tmpFile->bind( $thumb ); // keep alive with $thumb
1142
1143 $statTiming = microtime( true ) - $starttime;
1144 $stats->timing( 'media.thumbnail.generate.transform', 1000 * $statTiming );
1145
1146 if ( !$thumb ) { // bad params?
1147 $thumb = false;
1148 } elseif ( $thumb->isError() ) { // transform error
1150 $this->lastError = $thumb->toText();
1151 // Ignore errors if requested
1152 if ( $wgIgnoreImageErrors && !( $flags & self::RENDER_NOW ) ) {
1153 $thumb = $handler->getTransform( $this, $tmpThumbPath, $thumbUrl, $transformParams );
1154 }
1155 } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) {
1156 // Copy the thumbnail from the file system into storage...
1157
1158 $starttime = microtime( true );
1159
1160 $disposition = $this->getThumbDisposition( $thumbName );
1161 $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition );
1162 if ( $status->isOK() ) {
1163 $thumb->setStoragePath( $thumbPath );
1164 } else {
1165 $thumb = $this->transformErrorOutput( $thumbPath, $thumbUrl, $transformParams, $flags );
1166 }
1167
1168 $statTiming = microtime( true ) - $starttime;
1169 $stats->timing( 'media.thumbnail.generate.store', 1000 * $statTiming );
1170
1171 // Give extensions a chance to do something with this thumbnail...
1172 Hooks::run( 'FileTransformed', [ $this, $thumb, $tmpThumbPath, $thumbPath ] );
1173 }
1174
1175 return $thumb;
1176 }
1177
1184 protected function generateBucketsIfNeeded( $params, $flags = 0 ) {
1185 if ( !$this->repo
1186 || !isset( $params['physicalWidth'] )
1187 || !isset( $params['physicalHeight'] )
1188 ) {
1189 return false;
1190 }
1191
1192 $bucket = $this->getThumbnailBucket( $params['physicalWidth'] );
1193
1194 if ( !$bucket || $bucket == $params['physicalWidth'] ) {
1195 return false;
1196 }
1197
1198 $bucketPath = $this->getBucketThumbPath( $bucket );
1199
1200 if ( $this->repo->fileExists( $bucketPath ) ) {
1201 return false;
1202 }
1203
1204 $starttime = microtime( true );
1205
1206 $params['physicalWidth'] = $bucket;
1207 $params['width'] = $bucket;
1208
1209 $params = $this->getHandler()->sanitizeParamsForBucketing( $params );
1210
1211 $tmpFile = $this->makeTransformTmpFile( $bucketPath );
1212
1213 if ( !$tmpFile ) {
1214 return false;
1215 }
1216
1217 $thumb = $this->generateAndSaveThumb( $tmpFile, $params, $flags );
1218
1219 $buckettime = microtime( true ) - $starttime;
1220
1221 if ( !$thumb || $thumb->isError() ) {
1222 return false;
1223 }
1224
1225 $this->tmpBucketedThumbCache[$bucket] = $tmpFile->getPath();
1226 // For the caching to work, we need to make the tmp file survive as long as
1227 // this object exists
1228 $tmpFile->bind( $this );
1229
1230 RequestContext::getMain()->getStats()->timing(
1231 'media.thumbnail.generate.bucket', 1000 * $buckettime );
1232
1233 return true;
1234 }
1235
1241 public function getThumbnailSource( $params ) {
1242 if ( $this->repo
1243 && $this->getHandler()->supportsBucketing()
1244 && isset( $params['physicalWidth'] )
1245 && $bucket = $this->getThumbnailBucket( $params['physicalWidth'] )
1246 ) {
1247 if ( $this->getWidth() != 0 ) {
1248 $bucketHeight = round( $this->getHeight() * ( $bucket / $this->getWidth() ) );
1249 } else {
1250 $bucketHeight = 0;
1251 }
1252
1253 // Try to avoid reading from storage if the file was generated by this script
1254 if ( isset( $this->tmpBucketedThumbCache[$bucket] ) ) {
1255 $tmpPath = $this->tmpBucketedThumbCache[$bucket];
1256
1257 if ( file_exists( $tmpPath ) ) {
1258 return [
1259 'path' => $tmpPath,
1260 'width' => $bucket,
1261 'height' => $bucketHeight
1262 ];
1263 }
1264 }
1265
1266 $bucketPath = $this->getBucketThumbPath( $bucket );
1267
1268 if ( $this->repo->fileExists( $bucketPath ) ) {
1269 $fsFile = $this->repo->getLocalReference( $bucketPath );
1270
1271 if ( $fsFile ) {
1272 return [
1273 'path' => $fsFile->getPath(),
1274 'width' => $bucket,
1275 'height' => $bucketHeight
1276 ];
1277 }
1278 }
1279 }
1280
1281 // Thumbnailing a very large file could result in network saturation if
1282 // everyone does it at once.
1283 if ( $this->getSize() >= 1e7 ) { // 10MB
1284 $that = $this;
1285 $work = new PoolCounterWorkViaCallback( 'GetLocalFileCopy', sha1( $this->getName() ),
1286 [
1287 'doWork' => function () use ( $that ) {
1288 return $that->getLocalRefPath();
1289 }
1290 ]
1291 );
1292 $srcPath = $work->execute();
1293 } else {
1294 $srcPath = $this->getLocalRefPath();
1295 }
1296
1297 // Original file
1298 return [
1299 'path' => $srcPath,
1300 'width' => $this->getWidth(),
1301 'height' => $this->getHeight()
1302 ];
1303 }
1304
1310 protected function getBucketThumbPath( $bucket ) {
1311 $thumbName = $this->getBucketThumbName( $bucket );
1312 return $this->getThumbPath( $thumbName );
1313 }
1314
1320 protected function getBucketThumbName( $bucket ) {
1321 return $this->thumbName( [ 'physicalWidth' => $bucket ] );
1322 }
1323
1329 protected function makeTransformTmpFile( $thumbPath ) {
1330 $thumbExt = FileBackend::extensionFromPath( $thumbPath );
1331 return TempFSFile::factory( 'transform_', $thumbExt, wfTempDir() );
1332 }
1333
1339 function getThumbDisposition( $thumbName, $dispositionType = 'inline' ) {
1340 $fileName = $this->name; // file name to suggest
1341 $thumbExt = FileBackend::extensionFromPath( $thumbName );
1342 if ( $thumbExt != '' && $thumbExt !== $this->getExtension() ) {
1343 $fileName .= ".$thumbExt";
1344 }
1345
1346 return FileBackend::makeContentDisposition( $dispositionType, $fileName );
1347 }
1348
1355 function migrateThumbFile( $thumbName ) {
1356 }
1357
1364 function getHandler() {
1365 if ( !isset( $this->handler ) ) {
1366 $this->handler = MediaHandler::getHandler( $this->getMimeType() );
1367 }
1368
1369 return $this->handler;
1370 }
1371
1377 function iconThumb() {
1379 $assetsPath = "$wgResourceBasePath/resources/assets/file-type-icons/";
1380 $assetsDirectory = "$IP/resources/assets/file-type-icons/";
1381
1382 $try = [ 'fileicon-' . $this->getExtension() . '.png', 'fileicon.png' ];
1383 foreach ( $try as $icon ) {
1384 if ( file_exists( $assetsDirectory . $icon ) ) { // always FS
1385 $params = [ 'width' => 120, 'height' => 120 ];
1386
1387 return new ThumbnailImage( $this, $assetsPath . $icon, false, $params );
1388 }
1389 }
1390
1391 return null;
1392 }
1393
1399 function getLastError() {
1400 return $this->lastError;
1401 }
1402
1409 function getThumbnails() {
1410 return [];
1411 }
1412
1420 function purgeCache( $options = [] ) {
1421 }
1422
1428 function purgeDescription() {
1429 $title = $this->getTitle();
1430 if ( $title ) {
1432 $title->purgeSquid();
1433 }
1434 }
1435
1440 function purgeEverything() {
1441 // Delete thumbnails and refresh file metadata cache
1442 $this->purgeCache();
1443 $this->purgeDescription();
1444
1445 // Purge cache of all pages using this file
1446 $title = $this->getTitle();
1447 if ( $title ) {
1448 DeferredUpdates::addUpdate( new HTMLCacheUpdate( $title, 'imagelinks' ) );
1449 }
1450 }
1451
1463 function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
1464 return [];
1465 }
1466
1476 public function nextHistoryLine() {
1477 return false;
1478 }
1479
1486 public function resetHistory() {
1487 }
1488
1496 function getHashPath() {
1497 if ( !isset( $this->hashPath ) ) {
1498 $this->assertRepoDefined();
1499 $this->hashPath = $this->repo->getHashPath( $this->getName() );
1500 }
1501
1502 return $this->hashPath;
1503 }
1504
1511 function getRel() {
1512 return $this->getHashPath() . $this->getName();
1513 }
1514
1522 function getArchiveRel( $suffix = false ) {
1523 $path = 'archive/' . $this->getHashPath();
1524 if ( $suffix === false ) {
1525 $path = substr( $path, 0, -1 );
1526 } else {
1527 $path .= $suffix;
1528 }
1529
1530 return $path;
1531 }
1532
1540 function getThumbRel( $suffix = false ) {
1541 $path = $this->getRel();
1542 if ( $suffix !== false ) {
1543 $path .= '/' . $suffix;
1544 }
1545
1546 return $path;
1547 }
1548
1555 function getUrlRel() {
1556 return $this->getHashPath() . rawurlencode( $this->getName() );
1557 }
1558
1567 function getArchiveThumbRel( $archiveName, $suffix = false ) {
1568 $path = 'archive/' . $this->getHashPath() . $archiveName . "/";
1569 if ( $suffix === false ) {
1570 $path = substr( $path, 0, -1 );
1571 } else {
1572 $path .= $suffix;
1573 }
1574
1575 return $path;
1576 }
1577
1584 function getArchivePath( $suffix = false ) {
1585 $this->assertRepoDefined();
1586
1587 return $this->repo->getZonePath( 'public' ) . '/' . $this->getArchiveRel( $suffix );
1588 }
1589
1597 function getArchiveThumbPath( $archiveName, $suffix = false ) {
1598 $this->assertRepoDefined();
1599
1600 return $this->repo->getZonePath( 'thumb' ) . '/' .
1601 $this->getArchiveThumbRel( $archiveName, $suffix );
1602 }
1603
1610 function getThumbPath( $suffix = false ) {
1611 $this->assertRepoDefined();
1612
1613 return $this->repo->getZonePath( 'thumb' ) . '/' . $this->getThumbRel( $suffix );
1614 }
1615
1622 function getTranscodedPath( $suffix = false ) {
1623 $this->assertRepoDefined();
1624
1625 return $this->repo->getZonePath( 'transcoded' ) . '/' . $this->getThumbRel( $suffix );
1626 }
1627
1634 function getArchiveUrl( $suffix = false ) {
1635 $this->assertRepoDefined();
1636 $ext = $this->getExtension();
1637 $path = $this->repo->getZoneUrl( 'public', $ext ) . '/archive/' . $this->getHashPath();
1638 if ( $suffix === false ) {
1639 $path = substr( $path, 0, -1 );
1640 } else {
1641 $path .= rawurlencode( $suffix );
1642 }
1643
1644 return $path;
1645 }
1646
1654 function getArchiveThumbUrl( $archiveName, $suffix = false ) {
1655 $this->assertRepoDefined();
1656 $ext = $this->getExtension();
1657 $path = $this->repo->getZoneUrl( 'thumb', $ext ) . '/archive/' .
1658 $this->getHashPath() . rawurlencode( $archiveName ) . "/";
1659 if ( $suffix === false ) {
1660 $path = substr( $path, 0, -1 );
1661 } else {
1662 $path .= rawurlencode( $suffix );
1663 }
1664
1665 return $path;
1666 }
1667
1675 function getZoneUrl( $zone, $suffix = false ) {
1676 $this->assertRepoDefined();
1677 $ext = $this->getExtension();
1678 $path = $this->repo->getZoneUrl( $zone, $ext ) . '/' . $this->getUrlRel();
1679 if ( $suffix !== false ) {
1680 $path .= '/' . rawurlencode( $suffix );
1681 }
1682
1683 return $path;
1684 }
1685
1692 function getThumbUrl( $suffix = false ) {
1693 return $this->getZoneUrl( 'thumb', $suffix );
1694 }
1695
1702 function getTranscodedUrl( $suffix = false ) {
1703 return $this->getZoneUrl( 'transcoded', $suffix );
1704 }
1705
1712 function getVirtualUrl( $suffix = false ) {
1713 $this->assertRepoDefined();
1714 $path = $this->repo->getVirtualUrl() . '/public/' . $this->getUrlRel();
1715 if ( $suffix !== false ) {
1716 $path .= '/' . rawurlencode( $suffix );
1717 }
1718
1719 return $path;
1720 }
1721
1728 function getArchiveVirtualUrl( $suffix = false ) {
1729 $this->assertRepoDefined();
1730 $path = $this->repo->getVirtualUrl() . '/public/archive/' . $this->getHashPath();
1731 if ( $suffix === false ) {
1732 $path = substr( $path, 0, -1 );
1733 } else {
1734 $path .= rawurlencode( $suffix );
1735 }
1736
1737 return $path;
1738 }
1739
1746 function getThumbVirtualUrl( $suffix = false ) {
1747 $this->assertRepoDefined();
1748 $path = $this->repo->getVirtualUrl() . '/thumb/' . $this->getUrlRel();
1749 if ( $suffix !== false ) {
1750 $path .= '/' . rawurlencode( $suffix );
1751 }
1752
1753 return $path;
1754 }
1755
1759 function isHashed() {
1760 $this->assertRepoDefined();
1761
1762 return (bool)$this->repo->getHashLevels();
1763 }
1764
1768 function readOnlyError() {
1769 throw new MWException( get_class( $this ) . ': write operations are not supported' );
1770 }
1771
1787 function recordUpload( $oldver, $desc, $license = '', $copyStatus = '', $source = '',
1788 $watch = false, $timestamp = false, User $user = null
1789 ) {
1790 $this->readOnlyError();
1791 }
1792
1814 function publish( $src, $flags = 0, array $options = [] ) {
1815 $this->readOnlyError();
1816 }
1817
1822 function formatMetadata( $context = false ) {
1823 if ( !$this->getHandler() ) {
1824 return false;
1825 }
1826
1827 return $this->getHandler()->formatMetadata( $this, $context );
1828 }
1829
1835 function isLocal() {
1836 return $this->repo && $this->repo->isLocal();
1837 }
1838
1844 function getRepoName() {
1845 return $this->repo ? $this->repo->getName() : 'unknown';
1846 }
1847
1853 function getRepo() {
1854 return $this->repo;
1855 }
1856
1863 function isOld() {
1864 return false;
1865 }
1866
1874 function isDeleted( $field ) {
1875 return false;
1876 }
1877
1883 function getVisibility() {
1884 return 0;
1885 }
1886
1892 function wasDeleted() {
1893 $title = $this->getTitle();
1894
1895 return $title && $title->isDeletedQuick();
1896 }
1897
1910 function move( $target ) {
1911 $this->readOnlyError();
1912 }
1913
1929 function delete( $reason, $suppress = false, $user = null ) {
1930 $this->readOnlyError();
1931 }
1932
1947 function restore( $versions = [], $unsuppress = false ) {
1948 $this->readOnlyError();
1949 }
1950
1958 function isMultipage() {
1959 return $this->getHandler() && $this->handler->isMultiPage( $this );
1960 }
1961
1968 function pageCount() {
1969 if ( !isset( $this->pageCount ) ) {
1970 if ( $this->getHandler() && $this->handler->isMultiPage( $this ) ) {
1971 $this->pageCount = $this->handler->pageCount( $this );
1972 } else {
1973 $this->pageCount = false;
1974 }
1975 }
1976
1977 return $this->pageCount;
1978 }
1979
1989 static function scaleHeight( $srcWidth, $srcHeight, $dstWidth ) {
1990 // Exact integer multiply followed by division
1991 if ( $srcWidth == 0 ) {
1992 return 0;
1993 } else {
1994 return round( $srcHeight * $dstWidth / $srcWidth );
1995 }
1996 }
1997
2008 function getImageSize( $filePath ) {
2009 if ( !$this->getHandler() ) {
2010 return false;
2011 }
2012
2013 return $this->getHandler()->getImageSize( $this, $filePath );
2014 }
2015
2023 if ( $this->repo ) {
2024 return $this->repo->getDescriptionUrl( $this->getName() );
2025 } else {
2026 return false;
2027 }
2028 }
2029
2036 function getDescriptionText( $lang = false ) {
2038
2039 if ( !$this->repo || !$this->repo->fetchDescription ) {
2040 return false;
2041 }
2042
2043 $lang = $lang ?: $wgLang;
2044
2045 $renderUrl = $this->repo->getDescriptionRenderUrl( $this->getName(), $lang->getCode() );
2046 if ( $renderUrl ) {
2047 $cache = ObjectCache::getMainWANInstance();
2048 $key = $this->repo->getLocalCacheKey(
2049 'RemoteFileDescription',
2050 'url',
2051 $lang->getCode(),
2052 $this->getName()
2053 );
2054
2055 return $cache->getWithSetCallback(
2056 $key,
2057 $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
2058 function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) {
2059 wfDebug( "Fetching shared description from $renderUrl\n" );
2060 $res = Http::get( $renderUrl, [], __METHOD__ );
2061 if ( !$res ) {
2062 $ttl = WANObjectCache::TTL_UNCACHEABLE;
2063 }
2064
2065 return $res;
2066 }
2067 );
2068 }
2069
2070 return false;
2071 }
2072
2085 function getDescription( $audience = self::FOR_PUBLIC, User $user = null ) {
2086 return null;
2087 }
2088
2094 function getTimestamp() {
2095 $this->assertRepoDefined();
2096
2097 return $this->repo->getFileTimestamp( $this->getPath() );
2098 }
2099
2107 public function getDescriptionTouched() {
2108 return false;
2109 }
2110
2116 function getSha1() {
2117 $this->assertRepoDefined();
2118
2119 return $this->repo->getFileSha1( $this->getPath() );
2120 }
2121
2127 function getStorageKey() {
2128 $hash = $this->getSha1();
2129 if ( !$hash ) {
2130 return false;
2131 }
2132 $ext = $this->getExtension();
2133 $dotExt = $ext === '' ? '' : ".$ext";
2134
2135 return $hash . $dotExt;
2136 }
2137
2146 function userCan( $field, User $user = null ) {
2147 return true;
2148 }
2149
2153 function getStreamHeaders() {
2154 $handler = $this->getHandler();
2155 if ( $handler ) {
2156 return $handler->getStreamHeaders( $this->getMetadata() );
2157 } else {
2158 return [];
2159 }
2160 }
2161
2165 function getLongDesc() {
2166 $handler = $this->getHandler();
2167 if ( $handler ) {
2168 return $handler->getLongDesc( $this );
2169 } else {
2170 return MediaHandler::getGeneralLongDesc( $this );
2171 }
2172 }
2173
2177 function getShortDesc() {
2178 $handler = $this->getHandler();
2179 if ( $handler ) {
2180 return $handler->getShortDesc( $this );
2181 } else {
2182 return MediaHandler::getGeneralShortDesc( $this );
2183 }
2184 }
2185
2190 $handler = $this->getHandler();
2191 if ( $handler ) {
2192 return $handler->getDimensionsString( $this );
2193 } else {
2194 return '';
2195 }
2196 }
2197
2201 function getRedirected() {
2202 return $this->redirected;
2203 }
2204
2209 if ( $this->redirected ) {
2210 if ( !$this->redirectTitle ) {
2211 $this->redirectTitle = Title::makeTitle( NS_FILE, $this->redirected );
2212 }
2213
2214 return $this->redirectTitle;
2215 }
2216
2217 return null;
2218 }
2219
2224 function redirectedFrom( $from ) {
2225 $this->redirected = $from;
2226 }
2227
2231 function isMissing() {
2232 return false;
2233 }
2234
2239 public function isCacheable() {
2240 return true;
2241 }
2242
2247 protected function assertRepoDefined() {
2248 if ( !( $this->repo instanceof $this->repoClass ) ) {
2249 throw new MWException( "A {$this->repoClass} object is not set for this File.\n" );
2250 }
2251 }
2252
2257 protected function assertTitleDefined() {
2258 if ( !( $this->title instanceof Title ) ) {
2259 throw new MWException( "A Title object is not set for this File.\n" );
2260 }
2261 }
2262
2267 public function isExpensiveToThumbnail() {
2268 $handler = $this->getHandler();
2269 return $handler ? $handler->isExpensiveToThumbnail( $this ) : false;
2270 }
2271
2277 public function isTransformedLocally() {
2278 return true;
2279 }
2280}
Apache License January AND DISTRIBUTION Definitions License shall mean the terms and conditions for use
unserialize( $serialized)
$wgIgnoreImageErrors
If set, inline scaled images will still produce "<img>" tags ready for output instead of showing an e...
$wgThumbnailBuckets
When defined, is an array of image widths used as buckets for thumbnail generation.
$wgThumbnailMinimumBucketDistance
When using thumbnail buckets as defined above, this sets the minimum distance to the bucket above the...
$wgResourceBasePath
The default 'remoteBasePath' value for instances of ResourceLoaderFileModule.
$wgThumbnailEpoch
If rendered thumbnail files are older than this timestamp, they will be rerendered on demand as if th...
$wgTrustedMediaFormats
list of trusted media-types and MIME types.
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfTempDir()
Tries to get the system directory for temporary files.
wfExpandUrl( $url, $defaultProto=PROTO_CURRENT)
Expand a potentially local URL to a fully-qualified URL.
wfAppendQuery( $url, $query)
Append a query string to an existing URL, which may or may not already have query string parameters a...
$IP
Definition WebStart.php:58
$starttime
Definition api.php:40
Class representing a non-directory file on the file system.
Definition FSFile.php:29
getPath()
Returns the file system path.
Definition FSFile.php:50
static extensionFromPath( $path, $case='lowercase')
Get the final extension from a storage or FS path.
static makeContentDisposition( $type, $filename='')
Build a Content-Disposition header value per RFC 6266.
Base class for file repositories.
Definition FileRepo.php:37
Implements some public methods and some protected utility functions which are required by multiple ch...
Definition File.php:50
getStorageKey()
Get the deletion archive key, "<sha1>.<ext>".
Definition File.php:2127
string $url
The URL corresponding to one of the four basic zones.
Definition File.php:116
getVisibility()
Return the deletion bitfield STUB.
Definition File.php:1883
isVectorized()
Return true if the file is vectorized.
Definition File.php:554
recordUpload( $oldver, $desc, $license='', $copyStatus='', $source='', $watch=false, $timestamp=false, User $user=null)
Record a file upload in the upload log and the image table STUB Overridden by LocalFile.
Definition File.php:1787
restore( $versions=[], $unsuppress=false)
Restore all or specified deleted revisions to the given file.
Definition File.php:1947
isExpensiveToThumbnail()
True if creating thumbnails from the file is large or otherwise resource-intensive.
Definition File.php:2267
isLocal()
Returns true if the file comes from the local file repository.
Definition File.php:1835
getThumbRel( $suffix=false)
Get the path, relative to the thumbnail zone root, of the thumbnail directory or a particular file if...
Definition File.php:1540
getLastError()
Get last thumbnailing error.
Definition File.php:1399
getShortDesc()
Definition File.php:2177
generateAndSaveThumb( $tmpFile, $transformParams, $flags)
Generates a thumbnail according to the given parameters and saves it to storage.
Definition File.php:1117
MediaHandler $handler
Definition File.php:113
purgeDescription()
Purge the file description page, but don't go after pages using the file.
Definition File.php:1428
__construct( $title, $repo)
Call this constructor from child classes.
Definition File.php:165
getIsSafeFileUncached()
Uncached accessor.
Definition File.php:807
getArchivePath( $suffix=false)
Get the path of the archived file.
Definition File.php:1584
getBucketThumbName( $bucket)
Returns the name of the thumb for a given bucket.
Definition File.php:1320
FSFile bool $fsFile
False if undefined.
Definition File.php:110
const RENDER_NOW
Force rendering in the current process.
Definition File.php:58
getPath()
Return the storage path to the file.
Definition File.php:416
getThumbPath( $suffix=false)
Get the path of the thumbnail directory, or a particular file if $suffix is specified.
Definition File.php:1610
getThumbVirtualUrl( $suffix=false)
Get the virtual URL for a thumbnail file or directory.
Definition File.php:1746
getIsSafeFile()
Accessor for __get()
Definition File.php:798
redirectedFrom( $from)
Definition File.php:2224
getDescriptionTouched()
Returns the timestamp (in TS_MW format) of the last change of the description page.
Definition File.php:2107
transformErrorOutput( $thumbPath, $thumbUrl, $params, $flags)
Return either a MediaTransformError or placeholder thumbnail (if $wgIgnoreImageErrors)
Definition File.php:1013
array $tmpBucketedThumbCache
Cache of tmp filepaths pointing to generated bucket thumbnails, keyed by width.
Definition File.php:153
getMimeType()
Returns the MIME type of the file.
Definition File.php:706
getSize()
Return the size of the image file, in bytes Overridden by LocalFile, UnregisteredLocalFile STUB.
Definition File.php:695
string $extension
File extension.
Definition File.php:119
pageCount()
Returns the number of pages of a multipage document, or false for documents which aren't multipage do...
Definition File.php:1968
getMediaType()
Return the type of the media in the file.
Definition File.php:717
string $redirected
Main part of the title, with underscores (Title::getDBkey)
Definition File.php:104
getTranscodedUrl( $suffix=false)
Get the URL of the transcoded directory, or a particular file if $suffix is specified.
Definition File.php:1702
bool $isSafeFile
Whether this media file is in a format that is unlikely to contain viruses or malicious content.
Definition File.php:147
getRel()
Get the path of the file relative to the public zone root.
Definition File.php:1511
getLength()
Get the duration of a media file in seconds.
Definition File.php:540
static normalizeTitle( $title, $exception=false)
Given a string or Title object return either a valid Title object with namespace NS_FILE or null.
Definition File.php:183
getTimestamp()
Get the 14-character timestamp of the file upload.
Definition File.php:2094
assertRepoDefined()
Assert that $this->repo is set to a valid FileRepo instance.
Definition File.php:2247
getName()
Return the name of this file.
Definition File.php:296
resetHistory()
Reset the history pointer to the first element of the history.
Definition File.php:1486
canAnimateThumbIfAppropriate()
Will the thumbnail be animated if one would expect it to be.
Definition File.php:609
getWidth( $page=1)
Return the width of the image.
Definition File.php:462
getLocalRefPath()
Get an FS copy or original of this file and return the path.
Definition File.php:432
exists()
Returns true if file exists in the repository.
Definition File.php:876
const DELETE_SOURCE
Definition File.php:65
getThumbUrl( $suffix=false)
Get the URL of the thumbnail directory, or a particular file if $suffix is specified.
Definition File.php:1692
Title $redirectedTitle
Definition File.php:107
allowInlineDisplay()
Alias for canRender()
Definition File.php:768
mustRender()
Return true if the file is of a type that can't be directly rendered by typical browsers and needs to...
Definition File.php:759
getVirtualUrl( $suffix=false)
Get the public zone virtual URL for a current version source file.
Definition File.php:1712
isTrustedFile()
Returns true if the file is flagged as trusted.
Definition File.php:851
getHistory( $limit=null, $start=null, $end=null, $inc=true)
Return a fragment of the history of file.
Definition File.php:1463
isCacheable()
Check if this file object is small and can be cached.
Definition File.php:2239
getTransformScript()
Definition File.php:893
isMissing()
Definition File.php:2231
isVisible()
Returns true if file exists in the repository and can be included in a page.
Definition File.php:886
iconThumb()
Get a ThumbnailImage representing a file type icon.
Definition File.php:1377
getRepo()
Returns the repository.
Definition File.php:1853
getZoneUrl( $zone, $suffix=false)
Get the URL of the zone directory, or a particular file if $suffix is specified.
Definition File.php:1675
getDimensionsString()
Definition File.php:2189
const DELETED_COMMENT
Definition File.php:53
upgradeRow()
Upgrade the database row if there is one Called by ImagePage STUB.
Definition File.php:262
convertMetadataVersion( $metadata, $version)
get versioned metadata
Definition File.php:666
const FOR_PUBLIC
Definition File.php:68
getCanRender()
Accessor for __get()
Definition File.php:745
getArchiveVirtualUrl( $suffix=false)
Get the public zone virtual URL for an archived version source file.
Definition File.php:1728
assertTitleDefined()
Assert that $this->title is set to a Title.
Definition File.php:2257
getArchiveThumbPath( $archiveName, $suffix=false)
Get the path of an archived file's thumbs, or a particular thumb if $suffix is specified.
Definition File.php:1597
getHeight( $page=1)
Return the height of the image.
Definition File.php:476
getThumbnailSource( $params)
Returns the most appropriate source image for the thumbnail, given a target thumbnail size.
Definition File.php:1241
getArchiveThumbRel( $archiveName, $suffix=false)
Get the path, relative to the thumbnail zone root, for an archived file's thumbs directory or a speci...
Definition File.php:1567
getUser( $type='text')
Returns ID or name of user who uploaded the file STUB.
Definition File.php:531
makeTransformTmpFile( $thumbPath)
Creates a temp FS file with the same extension and the thumbnail.
Definition File.php:1329
getBitDepth()
Return the bit depth of the file Overridden by LocalFile STUB.
Definition File.php:685
publish( $src, $flags=0, array $options=[])
Move or copy a file to its public location.
Definition File.php:1814
isOld()
Returns true if the image is an old version STUB.
Definition File.php:1863
getTitle()
Return the associated title object.
Definition File.php:325
getDescriptionShortUrl()
Definition File.php:363
const DELETED_RESTRICTED
Definition File.php:55
canRender()
Checks if the output of transform() for this file is likely to be valid.
Definition File.php:733
getAvailableLanguages()
Gives a (possibly empty) list of languages to render the file in.
Definition File.php:574
getCommonMetaArray()
Like getMetadata but returns a handler independent array of common values.
Definition File.php:648
getOriginalTitle()
Return the title used to find this file.
Definition File.php:334
getRepoName()
Returns the name of the repository.
Definition File.php:1844
getDefaultRenderLanguage()
In files that support multiple language, what is the default language to use if none specified.
Definition File.php:590
readOnlyError()
Definition File.php:1768
migrateThumbFile( $thumbName)
Hook into transform() to allow migration of thumbnail files STUB Overridden by LocalFile.
Definition File.php:1355
static compare(File $a, File $b)
Callback for usort() to do file sorts by name.
Definition File.php:287
getCanonicalUrl()
Definition File.php:381
isMultipage()
Returns 'true' if this file is a type which supports multiple pages, e.g.
Definition File.php:1958
isSafeFile()
Determines if this media file is in a format that is unlikely to contain viruses or malicious content...
Definition File.php:785
getThumbnails()
Get all thumbnail names previously generated for this file STUB Overridden by LocalFile.
Definition File.php:1409
createThumb( $width, $height=-1)
Create a thumbnail of the image having the specified width/height.
Definition File.php:991
string $name
The name of a file from its title object.
Definition File.php:122
const RAW
Definition File.php:70
getTranscodedPath( $suffix=false)
Get the path of the transcoded directory, or a particular file if $suffix is specified.
Definition File.php:1622
load( $flags=0)
Load any lazy-loaded file object fields from source.
Definition File.php:866
getExtension()
Get the file extension, e.g.
Definition File.php:310
isHashed()
Definition File.php:1759
FileRepo LocalRepo ForeignAPIRepo bool $repo
Some member variables can be lazy-initialised using __get().
Definition File.php:95
transform( $params, $flags=0)
Transform a media file.
Definition File.php:1033
getImageSize( $filePath)
Get an image size array like that returned by getImageSize(), or false if it can't be determined.
Definition File.php:2008
getStreamHeaders()
Definition File.php:2153
nextHistoryLine()
Return the history of this file, line by line.
Definition File.php:1476
purgeEverything()
Purge metadata and all affected pages when the file is created, deleted, or majorly updated.
Definition File.php:1440
const DELETED_FILE
Definition File.php:52
getRedirected()
Definition File.php:2201
getDescriptionText( $lang=false)
Get the HTML text of the description page, if available.
Definition File.php:2036
string $path
The storage path corresponding to one of the zones.
Definition File.php:125
static normalizeExtension( $extension)
Normalize a file extension to the common form, making it lowercase and checking some synonyms,...
Definition File.php:223
string $pageCount
Number of pages of a multipage document, or false for documents which aren't multipage documents.
Definition File.php:133
static splitMime( $mime)
Split an internet media type into its two components; if not a two-part name, set the minor type to '...
Definition File.php:272
getUrl()
Return the URL of the file.
Definition File.php:347
Title string bool $title
Definition File.php:98
wasDeleted()
Was this file ever deleted from the wiki?
Definition File.php:1892
string $transformScript
URL of transformscript (for example thumb.php)
Definition File.php:136
string $repoClass
Required Repository class type.
Definition File.php:150
thumbName( $params, $flags=0)
Return the file name of a thumbnail with the specified parameters.
Definition File.php:937
const DELETED_USER
Definition File.php:54
getArchiveUrl( $suffix=false)
Get the URL of the archive directory, or a particular file if $suffix is specified.
Definition File.php:1634
getSha1()
Get the SHA-1 base 36 hash of the file.
Definition File.php:2116
getViewURL()
Definition File.php:388
formatMetadata( $context=false)
Definition File.php:1822
userCan( $field, User $user=null)
Determine if the current user is allowed to view a particular field of this file, if it's marked as d...
Definition File.php:2146
const THUMB_FULL_NAME
Definition File.php:73
Title $redirectTitle
Definition File.php:139
isTransformedLocally()
Whether the thumbnails created on the same server as this code is running.
Definition File.php:2277
getLongDesc()
Definition File.php:2165
getHandler()
Get a MediaHandler instance for this file.
Definition File.php:1364
getDescriptionUrl()
Get the URL of the image description page.
Definition File.php:2022
string $hashPath
Relative path including trailing slash.
Definition File.php:128
getBucketThumbPath( $bucket)
Returns the repo path of the thumb for a given bucket.
Definition File.php:1310
purgeCache( $options=[])
Purge shared caches such as thumbnails and DB data caching STUB Overridden by LocalFile.
Definition File.php:1420
getThumbnailBucket( $desiredWidth, $page=1)
Return the smallest bucket from $wgThumbnailBuckets which is at least $wgThumbnailMinimumBucketDistan...
Definition File.php:489
getUnscaledThumb( $handlerParams=[])
Get a ThumbnailImage which is the same size as the source.
Definition File.php:914
getArchiveRel( $suffix=false)
Get the path of an archived file relative to the public zone root.
Definition File.php:1522
getUrlRel()
Get urlencoded path of the file relative to the public zone root.
Definition File.php:1555
getThumbDisposition( $thumbName, $dispositionType='inline')
Definition File.php:1339
const FOR_THIS_USER
Definition File.php:69
move( $target)
Move file to the new title.
Definition File.php:1910
generateBucketsIfNeeded( $params, $flags=0)
Generates chained bucketed thumbnails if needed.
Definition File.php:1184
getRedirectedTitle()
Definition File.php:2208
__get( $name)
Definition File.php:204
static scaleHeight( $srcWidth, $srcHeight, $dstWidth)
Calculate the height of a thumbnail using the source and destination width.
Definition File.php:1989
isDeleted( $field)
Is this file a "deleted" file in a private archive? STUB.
Definition File.php:1874
getArchiveThumbUrl( $archiveName, $suffix=false)
Get the URL of the archived file's thumbs, or a particular thumb if $suffix is specified.
Definition File.php:1654
getDescription( $audience=self::FOR_PUBLIC, User $user=null)
Get description of file revision STUB.
Definition File.php:2085
getMetadata()
Get handler-specific metadata Overridden by LocalFile, UnregisteredLocalFile STUB.
Definition File.php:638
generateThumbName( $name, $params)
Generate a thumbnail file name from a name and specified parameters.
Definition File.php:952
bool $canRender
Whether the output of transform() for this file is likely to be valid.
Definition File.php:142
getFullUrl()
Return a fully-qualified URL to the file.
Definition File.php:374
const RENDER_FORCE
Force rendering even if thumbnail already exist and using RENDER_NOW I.e.
Definition File.php:63
static checkExtensionCompatibility(File $old, $new)
Checks if file extensions are compatible.
Definition File.php:248
getHashPath()
Get the filename hash component of the directory including trailing slash, e.g.
Definition File.php:1496
string $lastError
Text of last error.
Definition File.php:101
A foreign repository with a remote MediaWiki with an API thingy.
Class to invalidate the HTML cache of all the pages linking to a given title.
A repository that stores files in the local filesystem and registers them in the wiki's own database.
Definition LocalRepo.php:31
MediaWiki exception.
Base media handler class.
normaliseParams( $image, &$params)
Changes the parameter array as necessary, ready for transformation.
canAnimateThumbnail( $file)
If the material is animated, we can animate the thumbnail.
supportsBucketing()
Returns whether or not this handler supports the chained generation of thumbnails according to bucket...
static getGeneralLongDesc( $file)
Used instead of getLongDesc if there is no handler registered for file.
getStreamHeaders( $metadata)
Get useful response headers for GET/HEAD requests for a file with the given metadata.
getDefaultRenderLanguage(File $file)
On file types that support renderings in multiple languages, which language is used by default if uns...
getLength( $file)
If its an audio file, return the length of the file.
getTransform( $image, $dstPath, $dstUrl, $params)
Get a MediaTransformOutput object representing the transformed output.
getDimensionsString( $file)
Shown in file history box on image description page.
static getHandler( $type)
Get a MediaHandler for a given MIME type from the instance cache.
getCommonMetaArray(File $file)
Get an array of standard (FormatMetadata type) metadata values.
doTransform( $image, $dstPath, $dstUrl, $params, $flags=0)
Get a MediaTransformOutput object representing the transformed output.
isAnimatedImage( $file)
The material is an image, and is animated.
isVectorized( $file)
The material is vectorized and thus scaling is lossless.
convertMetadataVersion( $metadata, $version=1)
Convert metadata version.
static getGeneralShortDesc( $file)
Used instead of getShortDesc if there is no handler registered for file.
getLongDesc( $file)
Long description.
getScriptedTransform( $image, $script, $params)
Get a MediaTransformOutput object representing an alternate of the transformed output which will call...
isExpensiveToThumbnail( $file)
True if creating thumbnails from the file is large or otherwise resource-intensive.
getAvailableLanguages(File $file)
Get list of languages file can be viewed in.
getShortDesc( $file)
Short description.
Basic media transform error class.
static singleton()
Get an instance of this class.
Definition MimeMagic.php:29
Convenience class for dealing with PoolCounters using callbacks.
execute( $skipcache=false)
Get the result of the work (whatever it is), or the result of the error() function.
static getMain()
Static methods.
static factory( $prefix, $extension='', $tmpDirectory=null)
Make a new temporary file on the file system.
Media transform output for images.
Represents a title within MediaWiki.
Definition Title.php:36
purgeSquid()
Purge all applicable CDN URLs.
Definition Title.php:3631
isDeletedQuick()
Is there a version of this page in the deletion archive?
Definition Title.php:3183
invalidateCache( $purgeTime=null)
Updates page_touched for this page; called from LinksUpdate.php.
Definition Title.php:4429
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:48
$res
Definition database.txt:21
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
Definition deferred.txt:11
when a variable name is used in a it is silently declared as a new local masking the global
Definition design.txt:95
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add text
Definition design.txt:18
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at name
Definition design.txt:12
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as $wgLang
Definition design.txt:56
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such as
const PROTO_CANONICAL
Definition Defines.php:227
const NS_FILE
Definition Defines.php:62
const NS_MEDIA
Definition Defines.php:44
const PROTO_RELATIVE
Definition Defines.php:225
this hook is for auditing only RecentChangesLinked and Watchlist RecentChangesLinked and Watchlist e g Watchlist removed from all revisions and log entries to which it was applied This gives extensions a chance to take it off their books as the deletion has already been partly carried out by this point or something similar the user will be unable to create the tag set $status
Definition hooks.txt:1049
the array() calling protocol came about after MediaWiki 1.4rc1.
please add to it if you re going to add events to the MediaWiki code where normally authentication against an external auth plugin would be creating a local account $user
Definition hooks.txt:249
namespace are movable Hooks may change this value to override the return value of MWNamespace::isMovable(). 'NewDifferenceEngine' do that in ParserLimitReportFormat instead use this to modify the parameters of the image and a DIV can begin in one section and end in another Make sure your code can handle that case gracefully See the EditSectionClearerLink extension for an example zero but section is usually empty its values are the globals values before the output is cached one of or reset my talk my contributions etc etc otherwise the built in rate limiting checks are if enabled allows for interception of redirect as a string mapping parameter names to values & $type
Definition hooks.txt:2568
static configuration should be added through ResourceLoaderGetConfigVars instead can be used to get the real title after the basic globals have been set but before ordinary actions take place or wrap services the preferred way to define a new service is the $wgServiceWiringFiles array change it to the message you want to define you are encouraged to submit patches to MediaWiki s core to add new MIME types to mime types $mimeMagic
Definition hooks.txt:2228
this hook is for auditing only RecentChangesLinked and Watchlist RecentChangesLinked and Watchlist e g Watchlist removed from all revisions and log entries to which it was applied This gives extensions a chance to take it off their books as the deletion has already been partly carried out by this point or something similar the user will be unable to create the tag set and then return false from the hook function Ensure you consume the ChangeTagAfterDelete hook to carry out custom deletion actions as context called by AbstractContent::getParserOutput May be used to override the normal model specific rendering of page content as context as context $options
Definition hooks.txt:1096
this hook is for auditing only or null if authentication failed before getting that far or null if we can t even determine that probably a stub it is not rendered in wiki pages or galleries in category pages allow injecting custom HTML after the section Any uses of the hook need to handle escaping see BaseTemplate::getToolbox and BaseTemplate::makeListItem for details on the format of individual items inside of this array or by returning and letting standard HTTP rendering take place modifiable or by returning false and taking over the output modifiable modifiable after all normalizations have been except for the $wgMaxImageArea check set to true or false to override the $wgMaxImageArea check result gives extension the possibility to transform it themselves set to a MediaTransformOutput the error message to be returned in an array you should do so by altering $wgNamespaceProtection and $wgNamespaceContentModels outside the handler
Definition hooks.txt:952
either a unescaped string or a HtmlArmor object after in associative array form externallinks including delete and has completed for all link tables whether this was an auto creation default is conds Array Extra conditions for the No matching items in log is displayed if loglist is empty msgKey Array If you want a nice box with a set this to the key of the message First element is the message additional optional elements are parameters for the key that are processed with wfMessage() -> params() ->parseAsBlock() - offset Set to overwrite offset parameter in $wgRequest set to '' to unset offset - wrap String Wrap the message in html(usually something like "&lt;div ...>$1&lt;/div>"). - flags Integer display flags(NO_ACTION_LINK, NO_EXTRA_USER_LINKS) 'LogException':Called before an exception(or PHP error) is logged. This is meant for integration with external error aggregation services
it s the revision text itself In either if gzip is the revision text is gzipped $flags
Definition hooks.txt:2710
this hook is for auditing only RecentChangesLinked and Watchlist RecentChangesLinked and Watchlist e g Watchlist removed from all revisions and log entries to which it was applied This gives extensions a chance to take it off their books as the deletion has already been partly carried out by this point or something similar the user will be unable to create the tag set and then return false from the hook function Ensure you consume the ChangeTagAfterDelete hook to carry out custom deletion actions as context called by AbstractContent::getParserOutput May be used to override the normal model specific rendering of page content as context as context the output can only depend on parameters provided to this hook not on global state indicating whether full HTML should be generated If generation of HTML may be but other information should still be present in the ParserOutput object to manipulate or replace but no entry for that model exists in $wgContentHandlers if desired whether it is OK to use $contentModel on $title Handler functions that modify $ok should generally return false to prevent further hooks from further modifying $ok inclusive false for true for descending in case the handler function wants to provide a converted Content object Note that $result getContentModel() must return $toModel. 'CustomEditor' $rcid is used in generating this variable which contains information about the new such as the revision s whether the revision was marked as a minor edit or not
Definition hooks.txt:1207
this hook is for auditing only RecentChangesLinked and Watchlist RecentChangesLinked and Watchlist e g Watchlist removed from all revisions and log entries to which it was applied This gives extensions a chance to take it off their books as the deletion has already been partly carried out by this point or something similar the user will be unable to create the tag set and then return false from the hook function Ensure you consume the ChangeTagAfterDelete hook to carry out custom deletion actions as context called by AbstractContent::getParserOutput May be used to override the normal model specific rendering of page content as context as context the output can only depend on parameters provided to this hook not on global state indicating whether full HTML should be generated If generation of HTML may be but other information should still be present in the ParserOutput object to manipulate or replace but no entry for that model exists in $wgContentHandlers if desired whether it is OK to use $contentModel on $title Handler functions that modify $ok should generally return false to prevent further hooks from further modifying $ok inclusive $limit
Definition hooks.txt:1135
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses & $ret
Definition hooks.txt:1949
namespace are movable Hooks may change this value to override the return value of MWNamespace::isMovable(). 'NewDifferenceEngine' do that in ParserLimitReportFormat instead use this to modify the parameters of the image and a DIV can begin in one section and end in another Make sure your code can handle that case gracefully See the EditSectionClearerLink extension for an example zero but section is usually empty its values are the globals values before the output is cached $page
Definition hooks.txt:2534
see documentation in includes Linker php for Linker::makeImageLink & $handlerParams
Definition hooks.txt:1750
$from
$license
if( $limit) $timestamp
injection txt This is an overview of how MediaWiki makes use of dependency injection The design described here grew from the discussion of RFC T384 The term dependency this means that anything an object needs to operate should be injected from the the object itself should only know narrow no concrete implementation of the logic it relies on The requirement to inject everything typically results in an architecture that based on two main types of and essentially stateless service objects that use other service objects to operate on the value objects As of the beginning MediaWiki is only starting to use the DI approach Much of the code still relies on global state or direct resulting in a highly cyclical dependency which acts as the top level factory for services in MediaWiki which can be used to gain access to default instances of various services MediaWikiServices however also allows new services to be defined and default services to be redefined Services are defined or redefined by providing a callback the instantiator that will return a new instance of the service When it will create an instance of MediaWikiServices and populate it with the services defined in the files listed by thereby bootstrapping the DI framework Per $wgServiceWiringFiles lists includes ServiceWiring php
Definition injection.txt:37
Interface for database access objects.
$context
Definition load.php:50
$cache
Definition mcc.php:33
const MEDIATYPE_UNKNOWN
Definition defines.php:26
$source
title
This document describes the state of Postgres support in and is fairly well maintained The main code is very well while extensions are very hit and miss it is probably the most supported database after MySQL Much of the work in making MediaWiki database agnostic came about through the work of creating Postgres as and are nearing end of but without copying over all the usage comments General notes on the but these can almost always be programmed around *Although Postgres has a true BOOLEAN type
Definition postgres.txt:36
if( $ext=='php'|| $ext=='php5') $mime
Definition router.php:65
$params
if(!isset( $args[0])) $lang