MediaWiki
1.41.2
AssembleUploadChunksJob.php
Go to the documentation of this file.
1
<?php
21
use
MediaWiki\Request\WebRequestUpload
;
22
use
MediaWiki\Status\Status
;
23
use
MediaWiki\Title\Title
;
24
use Wikimedia\ScopedCallback;
25
32
class
AssembleUploadChunksJob
extends
Job
{
33
public
function
__construct
(
Title
$title, array $params ) {
34
parent::__construct(
'AssembleUploadChunks'
, $title, $params );
35
$this->removeDuplicates =
true
;
36
}
37
38
public
function
run
() {
39
$scope = RequestContext::importScopedSession( $this->params[
'session'
] );
40
$this->
addTeardownCallback
(
static
function
() use ( &$scope ) {
41
ScopedCallback::consume( $scope );
// T126450
42
} );
43
44
$context = RequestContext::getMain();
45
$user = $context->getUser();
46
try
{
47
if
( !$user->isRegistered() ) {
48
$this->
setLastError
(
"Could not load the author user from session."
);
49
50
return
false
;
51
}
52
53
UploadBase::setSessionStatus(
54
$user,
55
$this->params[
'filekey'
],
56
[
'result'
=>
'Poll'
,
'stage'
=>
'assembling'
,
'status'
=> Status::newGood() ]
57
);
58
59
$upload =
new
UploadFromChunks
( $user );
60
$upload->continueChunks(
61
$this->params[
'filename'
],
62
$this->params[
'filekey'
],
63
new
WebRequestUpload
( $context->getRequest(),
'null'
)
64
);
65
66
// Combine all of the chunks into a local file and upload that to a new stash file
67
$status = $upload->concatenateChunks();
68
if
( !$status->isGood() ) {
69
UploadBase::setSessionStatus(
70
$user,
71
$this->params[
'filekey'
],
72
[
'result'
=>
'Failure'
,
'stage'
=>
'assembling'
,
'status'
=> $status ]
73
);
74
75
// the chunks did not get assembled, but this should not be considered a job
76
// failure - they simply didn't pass verification for some reason, and that
77
// reason is stored in above session to inform the clients
78
return
true
;
79
}
80
81
// We can only get warnings like 'duplicate' after concatenating the chunks
82
$status = Status::newGood();
83
$status->value = [
84
'warnings'
=> UploadBase::makeWarningsSerializable(
85
$upload->checkWarnings( $user )
86
)
87
];
88
89
// We have a new filekey for the fully concatenated file
90
$newFileKey = $upload->getStashFile()->getFileKey();
91
92
// Remove the old stash file row and first chunk file
93
$upload->stash->removeFileNoAuth( $this->params[
'filekey'
] );
94
95
// Build the image info array while we have the local reference handy
96
$apiMain =
new
ApiMain
();
// dummy object (XXX)
97
$imageInfo = $upload->getImageInfo( $apiMain->getResult() );
98
99
// Cleanup any temporary local file
100
$upload->cleanupTempFile();
101
102
// Cache the info so the user doesn't have to wait forever to get the final info
103
UploadBase::setSessionStatus(
104
$user,
105
$this->params[
'filekey'
],
106
[
107
'result'
=>
'Success'
,
108
'stage'
=>
'assembling'
,
109
'filekey'
=> $newFileKey,
110
'imageinfo'
=> $imageInfo,
111
'status'
=> $status
112
]
113
);
114
}
catch
( Exception $e ) {
115
UploadBase::setSessionStatus(
116
$user,
117
$this->params[
'filekey'
],
118
[
119
'result'
=>
'Failure'
,
120
'stage'
=>
'assembling'
,
121
'status'
=> Status::newFatal(
'api-error-stashfailed'
)
122
]
123
);
124
$this->
setLastError
( get_class( $e ) .
": "
. $e->getMessage() );
125
// To be extra robust.
126
MWExceptionHandler::rollbackPrimaryChangesAndLog( $e );
127
128
return
false
;
129
}
130
131
return
true
;
132
}
133
134
public
function
getDeduplicationInfo
() {
135
$info = parent::getDeduplicationInfo();
136
if
( is_array( $info[
'params'
] ) ) {
137
$info[
'params'
] = [
'filekey'
=> $info[
'params'
][
'filekey'
] ];
138
}
139
140
return
$info;
141
}
142
143
public
function
allowRetries
() {
144
return
false
;
145
}
146
}
ApiMain
This is the main API class, used for both external and internal processing.
Definition
ApiMain.php:64
AssembleUploadChunksJob
Assemble the segments of a chunked upload.
Definition
AssembleUploadChunksJob.php:32
AssembleUploadChunksJob\__construct
__construct(Title $title, array $params)
Definition
AssembleUploadChunksJob.php:33
AssembleUploadChunksJob\run
run()
Run the job.
Definition
AssembleUploadChunksJob.php:38
AssembleUploadChunksJob\allowRetries
allowRetries()
bool Whether this job can be retried on failure by job runners 1.21to override
Definition
AssembleUploadChunksJob.php:143
AssembleUploadChunksJob\getDeduplicationInfo
getDeduplicationInfo()
Subclasses may need to override this to make duplication detection work.
Definition
AssembleUploadChunksJob.php:134
Job
Class to both describe a background job and handle jobs.
Definition
Job.php:40
Job\setLastError
setLastError( $error)
Definition
Job.php:432
Job\addTeardownCallback
addTeardownCallback( $callback)
Definition
Job.php:354
MediaWiki\Request\WebRequestUpload
Object to access the $_FILES array.
Definition
WebRequestUpload.php:36
MediaWiki\Status\Status
Generic operation result class Has warning/error list, boolean status and arbitrary value.
Definition
Status.php:58
MediaWiki\Title\Title
Represents a title within MediaWiki.
Definition
Title.php:76
UploadFromChunks
Implements uploading from chunks.
Definition
UploadFromChunks.php:36
includes
jobqueue
jobs
AssembleUploadChunksJob.php
Generated on Thu Jun 27 2024 15:42:09 for MediaWiki by
1.10.0