| Index: trunk/phase3/includes/SpecialUpload.php |
| — | — | @@ -30,7 +30,7 @@ |
| 31 | 31 | var $mUploadFile, $mUploadDescription, $mLicense ,$mIgnoreWarning, $mUploadError; |
| 32 | 32 | var $mUploadSaveName, $mUploadTempName, $mUploadSize, $mUploadOldVersion; |
| 33 | 33 | var $mUploadCopyStatus, $mUploadSource, $mReUpload, $mAction, $mUpload; |
| 34 | | - var $mOname, $mSessionKey, $mStashed, $mDestFile, $mRemoveTempFile; |
| | 34 | + var $mOname, $mSessionKey, $mStashed, $mDestFile, $mRemoveTempFile, $mSourceType; |
| 35 | 35 | /**#@-*/ |
| 36 | 36 | |
| 37 | 37 | /** |
| — | — | @@ -39,6 +39,7 @@ |
| 40 | 40 | * @param $request Data posted. |
| 41 | 41 | */ |
| 42 | 42 | function UploadForm( &$request ) { |
| | 43 | + global $wgAllowCopyUploads; |
| 43 | 44 | $this->mDestFile = $request->getText( 'wpDestFile' ); |
| 44 | 45 | |
| 45 | 46 | if( !$request->wasPosted() ) { |
| — | — | @@ -55,6 +56,7 @@ |
| 56 | 57 | $this->mUploadCopyStatus = $request->getText( 'wpUploadCopyStatus' ); |
| 57 | 58 | $this->mUploadSource = $request->getText( 'wpUploadSource' ); |
| 58 | 59 | $this->mWatchthis = $request->getBool( 'wpWatchthis' ); |
| | 60 | + $this->mSourceType = $request->getBool( 'wpSourceType' ); |
| 59 | 61 | wfDebug( "UploadForm: watchthis is: '$this->mWatchthis'\n" ); |
| 60 | 62 | |
| 61 | 63 | $this->mAction = $request->getVal( 'action' ); |
| — | — | @@ -79,17 +81,50 @@ |
| 80 | 82 | /** |
| 81 | 83 | *Check for a newly uploaded file. |
| 82 | 84 | */ |
| 83 | | - $this->mUploadTempName = $request->getFileTempName( 'wpUploadFile' ); |
| 84 | | - $this->mUploadSize = $request->getFileSize( 'wpUploadFile' ); |
| 85 | | - $this->mOname = $request->getFileName( 'wpUploadFile' ); |
| 86 | | - $this->mUploadError = $request->getUploadError( 'wpUploadFile' ); |
| 87 | | - $this->mSessionKey = false; |
| 88 | | - $this->mStashed = false; |
| 89 | | - $this->mRemoveTempFile = false; // PHP will handle this |
| | 85 | + if( $wgAllowCopyUploads && $this->mSourceType == 'web' ) { |
| | 86 | + $this->initialize_web_file( $request ); |
| | 87 | + } else { |
| | 88 | + $this->initialize_php_file( $request ); |
| | 89 | + } |
| 90 | 90 | } |
| 91 | 91 | } |
| 92 | 92 | |
| 93 | 93 | /** |
| | 94 | + * Initialize the uploaded file from PHP data |
| | 95 | + * @access private |
| | 96 | + */ |
| | 97 | + function initialize_php_file( &$request ) { |
| | 98 | + $this->mUploadTempName = $request->getFileTempName( 'wpUploadFile' ); |
| | 99 | + $this->mUploadSize = $request->getFileSize( 'wpUploadFile' ); |
| | 100 | + $this->mOname = $request->getFileName( 'wpUploadFile' ); |
| | 101 | + $this->mUploadError = $request->getUploadError( 'wpUploadFile' ); |
| | 102 | + $this->mSessionKey = false; |
| | 103 | + $this->mStashed = false; |
| | 104 | + $this->mRemoveTempFile = false; // PHP will handle this |
| | 105 | + } |
| | 106 | + |
| | 107 | + /** |
| | 108 | + * Copy a web file to a temporary file |
| | 109 | + * @access private |
| | 110 | + */ |
| | 111 | + function initialize_web_file( &$request ) { |
| | 112 | + global $wgTmpDirectory; |
| | 113 | + $url = $request->getText( 'wpUploadFile' ); |
| | 114 | + $local_file = tempnam( $wgTmpDirectory, 'WEBUPLOAD' ); |
| | 115 | + |
| | 116 | + # Maybe check for filesize($url) first? |
| | 117 | + $error = !@copy( $url, $local_file ); |
| | 118 | + |
| | 119 | + $this->mUploadTempName = $local_file; |
| | 120 | + $this->mUploadSize = filesize( $local_file ); |
| | 121 | + $this->mOname = array_pop( explode( '/', $url ) ); |
| | 122 | + $this->mUploadError = $error; |
| | 123 | + $this->mSessionKey = false; |
| | 124 | + $this->mStashed = false; |
| | 125 | + $this->mRemoveTempFile = false; // PHP will *not* handle this |
| | 126 | + } |
| | 127 | + |
| | 128 | + /** |
| 94 | 129 | * Start doing stuff |
| 95 | 130 | * @access public |
| 96 | 131 | */ |
| — | — | @@ -126,17 +161,17 @@ |
| 127 | 162 | } |
| 128 | 163 | |
| 129 | 164 | /** Check if the image directory is writeable, this is a common mistake */ |
| 130 | | - if ( !is_writeable( $wgUploadDirectory ) ) { |
| | 165 | + if( !is_writeable( $wgUploadDirectory ) ) { |
| 131 | 166 | $wgOut->addWikiText( wfMsg( 'upload_directory_read_only', $wgUploadDirectory ) ); |
| 132 | 167 | return; |
| 133 | 168 | } |
| 134 | 169 | |
| 135 | 170 | if( $this->mReUpload ) { |
| 136 | | - if ( !$this->unsaveUploadedFile() ) { |
| | 171 | + if( !$this->unsaveUploadedFile() ) { |
| 137 | 172 | return; |
| 138 | 173 | } |
| 139 | 174 | $this->mainUploadForm(); |
| 140 | | - } else if ( 'submit' == $this->mAction || $this->mUpload ) { |
| | 175 | + } else if( 'submit' == $this->mAction || $this->mUpload ) { |
| 141 | 176 | $this->processUpload(); |
| 142 | 177 | } else { |
| 143 | 178 | $this->mainUploadForm(); |
| — | — | @@ -156,7 +191,7 @@ |
| 157 | 192 | global $wgUser, $wgOut; |
| 158 | 193 | |
| 159 | 194 | /* Check for PHP error if any, requires php 4.2 or newer */ |
| 160 | | - if ( $this->mUploadError == 1/*UPLOAD_ERR_INI_SIZE*/ ) { |
| | 195 | + if( $this->mUploadError == 1/*UPLOAD_ERR_INI_SIZE*/ ) { |
| 161 | 196 | $this->mainUploadForm( wfMsgHtml( 'largefileserver' ) ); |
| 162 | 197 | return; |
| 163 | 198 | } |
| — | — | @@ -170,7 +205,7 @@ |
| 171 | 206 | } |
| 172 | 207 | |
| 173 | 208 | # Chop off any directories in the given filename |
| 174 | | - if ( $this->mDestFile ) { |
| | 209 | + if( $this->mDestFile ) { |
| 175 | 210 | $basename = wfBaseName( $this->mDestFile ); |
| 176 | 211 | } else { |
| 177 | 212 | $basename = wfBaseName( $this->mOname ); |
| — | — | @@ -196,7 +231,7 @@ |
| 197 | 232 | $partname .= '.' . $ext[$i]; |
| 198 | 233 | } |
| 199 | 234 | |
| 200 | | - if ( strlen( $partname ) < 3 ) { |
| | 235 | + if( strlen( $partname ) < 3 ) { |
| 201 | 236 | $this->mainUploadForm( wfMsgHtml( 'minlength' ) ); |
| 202 | 237 | return; |
| 203 | 238 | } |
| — | — | @@ -363,7 +398,9 @@ |
| 364 | 399 | * is a PHP-managed upload temporary |
| 365 | 400 | */ |
| 366 | 401 | function saveUploadedFile( $saveName, $tempName, $useRename = false ) { |
| 367 | | - global $wgOut; |
| | 402 | + global $wgOut, $wgAllowCopyUploads; |
| | 403 | + |
| | 404 | + if ( !$useRename AND $wgAllowCopyUploads AND $this->mSourceType == 'web' ) $useRename = true; |
| 368 | 405 | |
| 369 | 406 | $fname= "SpecialUpload::saveUploadedFile"; |
| 370 | 407 | |
| — | — | @@ -586,6 +623,7 @@ |
| 587 | 624 | function mainUploadForm( $msg='' ) { |
| 588 | 625 | global $wgOut, $wgUser; |
| 589 | 626 | global $wgUseCopyrightUpload; |
| | 627 | + global $wgRequest, $wgAllowCopyUploads; |
| 590 | 628 | |
| 591 | 629 | $cols = intval($wgUser->getOption( 'cols' )); |
| 592 | 630 | $ew = $wgUser->getOption( 'editwidth' ); |
| — | — | @@ -623,6 +661,14 @@ |
| 624 | 662 | $watchChecked = $wgUser->getOption( 'watchdefault' ) |
| 625 | 663 | ? 'checked="checked"' |
| 626 | 664 | : ''; |
| | 665 | + |
| | 666 | + if ( $wgAllowCopyUploads AND $wgRequest->getText('source') == 'web' ) { |
| | 667 | + $sourcetype = 'text'; |
| | 668 | + $source_comment = '<input type="hidden" name="wpSourceType" value="web"/>' . wfMsgHtml( 'upload_source_url' ); |
| | 669 | + } else { |
| | 670 | + $sourcetype = 'file'; |
| | 671 | + $source_comment = ''; |
| | 672 | + } |
| 627 | 673 | |
| 628 | 674 | $wgOut->addHTML( " |
| 629 | 675 | <form id='upload' method='post' enctype='multipart/form-data' action=\"$action\"> |
| — | — | @@ -630,7 +676,7 @@ |
| 631 | 677 | <tr> |
| 632 | 678 | <td align='right'><label for='wpUploadFile'>{$sourcefilename}:</label></td> |
| 633 | 679 | <td align='left'> |
| 634 | | - <input tabindex='1' type='file' name='wpUploadFile' id='wpUploadFile' " . ($this->mDestFile?"":"onchange='fillDestFilename()' ") . "size='40' /> |
| | 680 | + <input tabindex='1' type='{$sourcetype}' name='wpUploadFile' id='wpUploadFile' " . ($this->mDestFile?"":"onchange='fillDestFilename()' ") . "size='40' />{$source_comment} |
| 635 | 681 | </td> |
| 636 | 682 | </tr> |
| 637 | 683 | <tr> |
| Index: trunk/phase3/includes/DefaultSettings.php |
| — | — | @@ -337,6 +337,8 @@ |
| 338 | 338 | $wgSharedUploadDBprefix = ''; |
| 339 | 339 | /** Cache shared metadata in memcached. Don't do this if the commons wiki is in a different memcached domain */ |
| 340 | 340 | $wgCacheSharedUploads = true; |
| | 341 | +/** Allow for upload to be copied from an URL. Requires Special:Upload?source=web */ |
| | 342 | +$wgAllowCopyUploads = false; |
| 341 | 343 | |
| 342 | 344 | /** |
| 343 | 345 | * Point the upload navigation link to an external URL |
| Index: trunk/phase3/languages/MessagesEn.php |
| — | — | @@ -1149,6 +1149,7 @@ |
| 1150 | 1150 | 'license' => 'Licensing', |
| 1151 | 1151 | 'nolicense' => 'None selected', |
| 1152 | 1152 | 'licenses' => '-', # Don't duplicate this in translations |
| | 1153 | +'upload_source_url' => ' (vaild, publicy accessible URL)', |
| 1153 | 1154 | |
| 1154 | 1155 | # Image list |
| 1155 | 1156 | # |
| Index: trunk/phase3/RELEASE-NOTES |
| — | — | @@ -147,6 +147,7 @@ |
| 148 | 148 | * (bug 7044) Introduce "padleft" and "padright" colon functions |
| 149 | 149 | * Pass page title as parameters to "linkshere" and "nolinkshere" and update |
| 150 | 150 | default message text |
| | 151 | +* Allows to upload from publicy accessible URL. Set $wgAllowCopyUploads = true ; in LocalSettings.php |
| 151 | 152 | |
| 152 | 153 | == Languages updated == |
| 153 | 154 | |