[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Assemble the segments of a chunked upload. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup Upload 22 */ 23 24 /** 25 * Assemble the segments of a chunked upload. 26 * 27 * @ingroup Upload 28 */ 29 class AssembleUploadChunksJob extends Job { 30 public function __construct( $title, $params ) { 31 parent::__construct( 'AssembleUploadChunks', $title, $params ); 32 $this->removeDuplicates = true; 33 } 34 35 public function run() { 36 $scope = RequestContext::importScopedSession( $this->params['session'] ); 37 $context = RequestContext::getMain(); 38 try { 39 $user = $context->getUser(); 40 if ( !$user->isLoggedIn() ) { 41 $this->setLastError( "Could not load the author user from session." ); 42 43 return false; 44 } 45 46 if ( count( $_SESSION ) === 0 ) { 47 // Empty session probably indicates that we didn't associate 48 // with the session correctly. Note that being able to load 49 // the user does not necessarily mean the session was loaded. 50 // Most likely cause by suhosin.session.encrypt = On. 51 $this->setLastError( "Error associating with user session. " . 52 "Try setting suhosin.session.encrypt = Off" ); 53 54 return false; 55 } 56 57 UploadBase::setSessionStatus( 58 $this->params['filekey'], 59 array( 'result' => 'Poll', 'stage' => 'assembling', 'status' => Status::newGood() ) 60 ); 61 62 $upload = new UploadFromChunks( $user ); 63 $upload->continueChunks( 64 $this->params['filename'], 65 $this->params['filekey'], 66 $context->getRequest() 67 ); 68 69 // Combine all of the chunks into a local file and upload that to a new stash file 70 $status = $upload->concatenateChunks(); 71 if ( !$status->isGood() ) { 72 UploadBase::setSessionStatus( 73 $this->params['filekey'], 74 array( 'result' => 'Failure', 'stage' => 'assembling', 'status' => $status ) 75 ); 76 $this->setLastError( $status->getWikiText() ); 77 78 return false; 79 } 80 81 // We have a new filekey for the fully concatenated file 82 $newFileKey = $upload->getLocalFile()->getFileKey(); 83 84 // Remove the old stash file row and first chunk file 85 $upload->stash->removeFileNoAuth( $this->params['filekey'] ); 86 87 // Build the image info array while we have the local reference handy 88 $apiMain = new ApiMain(); // dummy object (XXX) 89 $imageInfo = $upload->getImageInfo( $apiMain->getResult() ); 90 91 // Cleanup any temporary local file 92 $upload->cleanupTempFile(); 93 94 // Cache the info so the user doesn't have to wait forever to get the final info 95 UploadBase::setSessionStatus( 96 $this->params['filekey'], 97 array( 98 'result' => 'Success', 99 'stage' => 'assembling', 100 'filekey' => $newFileKey, 101 'imageinfo' => $imageInfo, 102 'status' => Status::newGood() 103 ) 104 ); 105 } catch ( MWException $e ) { 106 UploadBase::setSessionStatus( 107 $this->params['filekey'], 108 array( 109 'result' => 'Failure', 110 'stage' => 'assembling', 111 'status' => Status::newFatal( 'api-error-stashfailed' ) 112 ) 113 ); 114 $this->setLastError( get_class( $e ) . ": " . $e->getText() ); 115 // To be extra robust. 116 MWExceptionHandler::rollbackMasterChangesAndLog( $e ); 117 118 return false; 119 } 120 121 return true; 122 } 123 124 public function getDeduplicationInfo() { 125 $info = parent::getDeduplicationInfo(); 126 if ( is_array( $info['params'] ) ) { 127 $info['params'] = array( 'filekey' => $info['params']['filekey'] ); 128 } 129 130 return $info; 131 } 132 133 public function allowRetries() { 134 return false; 135 } 136 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |