API:Upload
| Cette page fait partie de la documentation de l'API MediaWiki Action. |
| Version de MediaWiki : | ≥ 1.16 |
Requête POST pour téléverser un fichier.
Il existe trois méthodes pour téléverser des fichiers via l'API :
- Téléverser un fichier local directement
- Téléverser une copie d'un fichier à partir d'une URL
- Téléverser un fichier local par parties
Toutes ces méthodes imposent que le compte a les droits upload.
Documentation de l'API
Avertissements de téléversement
Notez qu'un téléversement peut échouer en raison d'un certain nombre de conditions d'avertissement. Vous pouvez remplacer ce paramètre en définissant ignorewarnings=1. Voici quelques avertissements notables :
- exists: Un fichier portant le nom donné existe déjà. Si cet avertissement est ignoré, le fichier téléversé remplacera le fichier existant.
- no-change: Un fichier avec le nom donné existe déjà; il est exactement le même que le fichier téléversé.
- duplicateversions: Un fichier avec le nom donné existe déjà et l'ancienne version de ce fichier est exactement la même que le fichier téléversé.
- was-deleted: un fichier avec le nom donné a déjà existé par le passé mais a été supprimé.
- duplicate: Le fichier téléversé existe sous un nom différent (ou identique). Le téléversement d'un doublon peut être non souhaité.
- duplicate-archive: Le fichier téléversé existait sous un nom différent (ou identique) mais a été supprimé. Cela peut indiquer que le fichier est inapproprié et ne doit pas être téléversé.
- badfilename: Le nom du fichier fourni n'est pas accepté sur ce wiki par exemple parce qu'il contient des caractères interdits
| Résultat |
|---|
{
"upload": {
"result": "Warning",
"warnings": {
"badfilename": "My_bad:filename.png"
},
"filekey": "19mmz8arzreg.9md1cj.2283740.png",
"sessionkey": "19mmz8arzreg.9md1cj.2283740.png"
}
}
|
Exemple
Faire une requête POST donnée est un processus en plusieurs étapes :
- Connectez-vous via l'une des méthodes décrites dans API:Authentification.
- Obtenir un jeton CSRF :
- Envoyez une demande POST, avec le jeton CSRF pour téléverser un fichier.
Exemple n°1 : téléverser directement un fichier local
Lorsque vous téléversez des fichiers directement, la requête doit utiliser multipart/form-data en tant que Content-Type ou enctype, application/x-www-form-urlencoded ne fonctionnera pas.
Requête POST
Réponse
| Résultat |
|---|
{
"upload": {
"filename": "File_1.jpg",
"result": "Success",
"imageinfo": {
"url": "https://upload.wikimedia.org/wikipedia/test/3/39/File_1.jpg",
"html": "<p>A file with this name exists already, please check <strong><a class=\"mw-selflink selflink\">File:File 1.jpg</a></strong> if you are not sure if you want to change it.\n</p>\n<div class=\"thumb tright\"><div class=\"thumbinner\" style=\"width:182px;\"><a href=\"/w/index.php?title=Special:Upload&wpDestFile=File_1.jpg\" class=\"new\" title=\"File:File 1.jpg\">File:File 1.jpg</a> <div class=\"thumbcaption\"></div></div></div>\n",
"width": 474,
"size": 26703,
"bitdepth": 8,
"mime": "image/jpeg",
"userid": 42588,
"mediatype": "BITMAP",
"descriptionurl": "https://test.wikipedia.org/wiki/File:File_1.jpg",
"extmetadata": {
"ObjectName": {
"value": "File 1",
"hidden": "",
"source": "mediawiki-metadata"
},
"DateTime": {
"value": "2019-03-06 08:43:37",
"hidden": "",
"source": "mediawiki-metadata"
}
...
},
"comment": "",
"commonmetadata": [],
"descriptionshorturl": "https://test.wikipedia.org/w/index.php?curid=0",
"sha1": "2ffadd0da73fab31a50407671622fd6e5282d0cf",
"parsedcomment": "",
"metadata": [
{
"name": "MEDIAWIKI_EXIF_VERSION",
"value": 2
}
],
"canonicaltitle": "File:File 1.jpg",
"user": "Mansi29ag",
"timestamp": "2019-03-06T08:43:37Z",
"height": 296
}
}
}
|
Exemple de code
Python
"""
upload_file_directly.py
MediaWiki API Demos
Demo of `Upload` module: Sending post request to upload a file directly
MIT license
"""
import requests
S = requests.Session()
URL = "https://test.wikipedia.org/w/api.php"
FILE_PATH = 'f.jpg'
# Step 1: Retrieve a login token
PARAMS_1 = {
"action": "query",
"meta": "tokens",
"type": "login",
"format": "json"
}
R = S.get(url=URL, params=PARAMS_1)
DATA = R.json()
LOGIN_TOKEN = DATA["query"]["tokens"]["logintoken"]
# Step 2: Send a post request to login. Use of main account for login is not
# supported. Obtain credentials via Special:BotPasswords
# (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
PARAMS_2 = {
"action": "login",
"lgname": "bot_username",
"lgpassword": "bot_password",
"format": "json",
"lgtoken": LOGIN_TOKEN
}
R = S.post(URL, data=PARAMS_2)
# Step 3: Obtain a CSRF token
PARAMS_3 = {
"action": "query",
"meta":"tokens",
"format":"json"
}
R = S.get(url=URL, params=PARAMS_3)
DATA = R.json()
CSRF_TOKEN = DATA["query"]["tokens"]["csrftoken"]
# Step 4: Post request to upload a file directly
PARAMS_4 = {
"action": "upload",
"filename": "file_1.jpg",
"format": "json",
"token": CSRF_TOKEN,
"ignorewarnings": 1
}
FILE = {'file':('file_1.jpg', open(FILE_PATH, 'rb'), 'multipart/form-data')}
R = S.post(URL, files=FILE, data=PARAMS_4)
DATA = R.json()
print(DATA)
PHP
<?php
/*
upload_file_directly.php
MediaWiki API Demos
Demo of `Upload` module: Sending post request to upload a file directly
MIT license
*/
$endPoint = "https://test.wikipedia.org/w/api.php";
$login_Token = getLoginToken(); // Step 1
loginRequest( $login_Token ); // Step 2
$csrf_Token = getCSRFToken(); // Step 3
upload( $csrf_Token ); // Step 4
// Step 1: GET request to fetch login token
function getLoginToken() {
global $endPoint;
$params1 = [
"action" => "query",
"meta" => "tokens",
"type" => "login",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params1 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["logintoken"];
}
// Step 2: POST request to log in. Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest( $logintoken ) {
global $endPoint;
$params2 = [
"action" => "login",
"lgname" => "bot_user_name",
"lgpassword" => "bot_password",
"lgtoken" => $logintoken,
"format" => "json"
];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $endPoint );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params2 ) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
}
// Step 3: GET request to fetch CSRF token
function getCSRFToken() {
global $endPoint;
$params3 = [
"action" => "query",
"meta" => "tokens",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params3 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["csrftoken"];
}
// Step 4: POST request to upload a file directly
function upload( $csrftoken ) {
global $endPoint;
$params4 = [
"action" => "upload",
"filename" => "Sandboxfile1.jpg",
"file" => curl_file_create("localfile.jpg", "image/jpeg", "Sandboxfile1.jpg"),
"ignorewarnings" => "1",
"token" => $csrftoken,
"format" => "json"
];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $endPoint );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-type: multipart/form-data'));
curl_setopt( $ch, CURLOPT_POSTFIELDS, $params4 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
echo ( $output );
}
JavaScript
/*
upload_file_directly.js
MediaWiki API Demos
Demo of `Upload` module: Sending post request to upload a file directly
MIT license
*/
var fs = require('fs'),
request = require('request').defaults({jar: true}),
url = "https://test.wikipedia.org/w/api.php";
// Step 1: GET request to fetch login token
function getLoginToken() {
var params_0 = {
action: "query",
meta: "tokens",
type: "login",
format: "json"
};
request.get({ url: url, qs: params_0 }, function (error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
loginRequest(data.query.tokens.logintoken);
});
}
// Step 2: POST request to log in.
// Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest(login_token) {
var params_1 = {
action: "login",
lgname: "bot_username",
lgpassword: "bot_password",
lgtoken: login_token,
format: "json"
};
request.post({ url: url, form: params_1 }, function (error, res, body) {
if (error) {
return;
}
getCsrfToken();
});
}
// Step 3: GET request to fetch CSRF token
function getCsrfToken() {
var params_2 = {
action: "query",
meta: "tokens",
format: "json"
};
request.get({ url: url, qs: params_2 }, function(error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
upload(data.query.tokens.csrftoken);
});
}
// Step 4: POST request to upload a file directly
function upload(csrf_token) {
var params_3 = {
action: "upload",
filename: "Sandboxfile1.jpg",
ignorewarnings: "1",
token: csrf_token,
format: "json"
};
var file = {
file: fs.createReadStream('My.jpg')
};
var formData = Object.assign( {}, params_3, file );
request.post({ url: url, formData: formData }, function (error, res, body) {
body = JSON.parse(body);
if (error) {
return;
}
else if (body.upload.result === "Success"){
console.log("File Uploaded :)");
}
});
}
// Start From Step 1
getLoginToken();
MediaWiki JS
/*
upload_file_directly.js
MediaWiki API Demos
Demo of `Upload` module: Sending post request to upload a file directly
MIT license
*/
var param = {
filename: 'File_1.jpg',
format: 'json',
ignorewarnings: 1
},
fileInput = $( '<input/>' ).attr( 'type', 'file' ),
submitBtn = $( '<input/>' ).attr( 'type', 'button' ).attr( 'value', 'Upload' ),
api = new mw.Api();
$( '#bodyContent' ).append( [ fileInput, submitBtn ] );
$( submitBtn ).on( 'click', function () {
api.upload( fileInput[ 0 ], param ).done( function ( data ) {
console.log( data.upload.filename + ' has sucessfully uploaded.' );
} ).fail( function ( data ) {
console.log( data );
} );
} );
Exemple n°2 : téléverser un fichier depuis une URL
Cela nécessite $wgAllowCopyUploads = true dans les paramètres locaux du wiki et un compte avec le droit d'utilisateur upload_by_url.
Requête POST
Réponse
| Résultat |
|---|
{
"upload": {
"result": "Success",
"filename": "New_image.jpg",
},
"imageinfo": {
"userid": 42588,
"commonmetadata": [],
"sha1": "0553e6106acdc4d09d9ec5f204aff9e7594193cc",
"bitdepth": 8,
"extmetadata": {
"ObjectName": {
"source": "mediawiki-metadata",
"hidden": "",
"value": "Tempa123"
},
"CommonsMetadataExtension": {
"source": "extension",
"hidden": "",
"value": 1.2
},
"Categories": {
"source": "commons-categories",
"hidden": "",
"value": ""
},
"DateTime": {
"source": "mediawiki-metadata",
"hidden": "",
"value": "2019-03-06 18:24:46"
},
"Assessments": {
"source": "commons-categories",
"hidden": "",
"value": ""
}
},
"descriptionshorturl": "https://test.wikipedia.org/w/index.php?curid=0",
"height": 240,
"mediatype": "BITMAP",
"timestamp": "2019-03-06T18:30:53Z",
"descriptionurl": "https://test.wikipedia.org/wiki/File:New_image.jpg",
"metadata": [
{
"value": 2,
"name": "MEDIAWIKI_EXIF_VERSION"
}
],
"mime": "image/jpeg",
"url": "https://upload.wikimedia.org/wikipedia/test/3/34/New_image.jpg",
"user": "Mansi29ag",
"width": 320,
"size": 27202,
"parsedcomment": "",
"canonicaltitle": "File:New image.jpg",
"html": "<p>A file with this name exists already, please check <strong><a class=\"mw-selflink selflink\">File:New image.jpg</a></strong> if you are not sure if you want to change it.\n</p>\n<div class=\"thumb tright\"><div class=\"thumbinner\" style=\"width:182px;\"><a href=\"/w/index.php?title=Special:Upload&wpDestFile=New_image.jpg\" class=\"new\" title=\"File:New image.jpg\">File:New image.jpg</a> <div class=\"thumbcaption\"></div></div></div>\n",
"comment": ""
}
}
}
|
Exemple de code
Python
"""
upload_file_from_url.py
MediaWiki API Demos
Demo of `Upload` module: Post request to upload a file from a URL
MIT license
"""
import requests
S = requests.Session()
URL = "https://test.wikipedia.org/w/api.php"
# Step 1: Retrieve a login token
PARAMS_1 = {
"action": "query",
"meta": "tokens",
"type": "login",
"format": "json"
}
R = S.get(url=URL, params=PARAMS_1)
DATA = R.json()
LOGIN_TOKEN = DATA["query"]["tokens"]["logintoken"]
# Step 2: Send a post request to login. Use of main account for login is not
# supported. Obtain credentials via Special:BotPasswords
# (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
PARAMS_2 = {
"action": "login",
"lgname": "bot_username",
"lgpassword": "bot_password",
"format": "json",
"lgtoken": LOGIN_TOKEN
}
R = S.post(URL, data=PARAMS_2)
# Step 3: While logged in, retrieve a CSRF token
PARAMS_3 = {
"action": "query",
"meta":"tokens",
"format":"json"
}
R = S.get(url=URL, params=PARAMS_3)
DATA = R.json()
CSRF_TOKEN = DATA["query"]["tokens"]["csrftoken"]
# Step 4: Post request to upload a file from a URL
PARAMS_4 = {
"action": "upload",
"filename": "new_image.jpg",
"url": "https://farm9.staticflickr.com/8213/8300206113_374c017fc5.jpg",
"format": "json",
"token": CSRF_TOKEN,
"ignorewarnings": 1
}
R = S.post(URL, data=PARAMS_4)
DATA = R.json()
print(DATA)
PHP
<?php
/*
upload_file_from_url.php
MediaWiki API Demos
Demo of `Upload` module: Post request to upload a file from a URL
MIT license
*/
$endPoint = "https://test.wikipedia.org/w/api.php";
$login_Token = getLoginToken(); // Step 1
loginRequest( $login_Token ); // Step 2
$csrf_Token = getCSRFToken(); // Step 3
upload( $csrf_Token ); // Step 4
// Step 1: GET request to fetch login token
function getLoginToken() {
global $endPoint;
$params1 = [
"action" => "query",
"meta" => "tokens",
"type" => "login",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params1 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["logintoken"];
}
// Step 2: POST request to log in. Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest( $logintoken ) {
global $endPoint;
$params2 = [
"action" => "login",
"lgname" => "bot_user_name",
"lgpassword" => "bot_password",
"lgtoken" => $logintoken,
"format" => "json"
];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $endPoint );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params2 ) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
}
// Step 3: GET request to fetch CSRF token
function getCSRFToken() {
global $endPoint;
$params3 = [
"action" => "query",
"meta" => "tokens",
"format" => "json"
];
$url = $endPoint . "?" . http_build_query( $params3 );
$ch = curl_init( $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
$result = json_decode( $output, true );
return $result["query"]["tokens"]["csrftoken"];
}
// Step 4: POST request to upload a file from a URL
function upload( $csrftoken ) {
global $endPoint;
$params4 = [
"action" => "upload",
"filename" => "Test-Jayprakash12345.jpg",
"url" => "https://farm9.staticflickr.com/8213/8300206113_374c017fc5.jpg",
"ignorewarnings" => "1",
"token" => $csrftoken,
"format" => "json"
];
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $endPoint );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params4 ) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$output = curl_exec( $ch );
curl_close( $ch );
echo ( $output );
}
JavaScript
/*
upload_file_from_url.js
MediaWiki API Demos
Demo of `Upload` module: Post request to upload a file from a URL
MIT license
*/
var request = require('request').defaults({jar: true}),
url = "https://test.wikipedia.org/w/api.php";
// Step 1: GET request to fetch login token
function getLoginToken() {
var params_0 = {
action: "query",
meta: "tokens",
type: "login",
format: "json"
};
request.get({ url: url, qs: params_0 }, function (error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
loginRequest(data.query.tokens.logintoken);
});
}
// Step 2: POST request to log in.
// Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest(login_token) {
var params_1 = {
action: "login",
lgname: "bot_username",
lgpassword: "bot_password",
lgtoken: login_token,
format: "json"
};
request.post({ url: url, form: params_1 }, function (error, res, body) {
if (error) {
return;
}
getCsrfToken();
});
}
// Step 3: GET request to fetch CSRF token
function getCsrfToken() {
var params_2 = {
action: "query",
meta: "tokens",
format: "json"
};
request.get({ url: url, qs: params_2 }, function(error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
editRequest(data.query.tokens.csrftoken);
});
}
// Step 4: POST request to upload a file from a URL
function editRequest(csrf_token) {
var params_3 = {
action: "upload",
filename: "Test-ABCD.jpg",
url: "https://farm9.staticflickr.com/8213/8300206113_374c017fc5.jpg",
ignorewarnings: "1",
token: csrf_token,
format: "json"
};
request.post({ url: url, form: params_3 }, function (error, res, body) {
if (error) {
return;
}
console.log(body);
});
}
// Start From Step 1
getLoginToken();
MediaWiki JS
/*
upload_file_from_url.js
MediaWiki API Demos
Demo of `Upload` module: Post request to upload a file from a URL
MIT License
*/
var params = {
action: 'upload',
filename: 'New_image.jpg',
url: 'https://farm9.staticflickr.com/8213/8300206113_374c017fc5.jpg',
ignorewarnings: '1',
format: 'json'
},
api = new mw.Api();
api.postWithToken( 'csrf', params ).done( function ( data ) {
console.log( data );
} );
Exemple n°3 : téléverser un fichier par parties
Comme le téléversement d'un gros fichier avec un seul HTTP POST peut devenir peu fiable, l'API prend également en charge un mode de téléversement segmenté, où vous effectuez plusieurs demandes contenant les parties successives du fichier. Ceci est disponible dans MediaWiki version 1.20 et supérieure, bien qu'avant la version 1.25, les SVG ne pouvaient pas être téléversés via le téléchargement groupé. C'est utilisé par Extension:UploadWizard dans les navigateurs prenant en charge FileAPI, en téléversant des fichiers par morceaux de 1 mégaoctet, mais vous pouvez choisir votre propre taille. Cela fonctionne en conjonction avec le mode stash, pour construire un fichier par morceaux et ensuite le valider à la fin.
Étape n°1 : transmettre le contenu de la première partie
Pour tous les morceaux sauf le dernier, vous recevrez ceci :
| Résultat 1 |
|---|
{
"upload": {
"offset": 5000,
"result": "Continue",
"filekey": "16gqn54g1z98.4g5brp.42588.jpg"
}
}
|
Étape n°2 : passer le paramètre filekey du second morceau et les suivants
Vous obtiendrez également le paramètre filekey à partir du précédent résultat continu :
Pour le dernier morceau, vous recevrez ceci :
| Résultat 2 |
|---|
{
"upload": {
"filekey": "16gqn663shqw.pop712.42588.jpg",
"imageinfo": {
"mediatype": "UNKNOWN",
"user": "None",
"comment": "None",
"height": 600,
"size": 48316,
"descriptionurl": "https://test.wikipedia.org/wiki/Special:UploadStash/file/16gqn663shqw.pop712.42588.jpg",
"html": "<p>A file with this name exists already, please check <strong><a class=\"mw-selflink selflink\">File:20190314182304!chunkedupload 4a2a524b5147.jpg</a></strong> if you are not sure if you want to change it.\n</p>\n<div class=\"thumb tright\"><div class=\"thumbinner\" style=\"width:182px;\"><a href=\"/w/index.php?title=Special:Upload&wpDestFile=20190314182304!chunkedupload_4a2a524b5147.jpg\" class=\"new\" title=\"File:20190314182304!chunkedupload 4a2a524b5147.jpg\">File:20190314182304!chunkedupload 4a2a524b5147.jpg</a> <div class=\"thumbcaption\"></div></div></div>\n",
"canonicaltitle": "File:20190314182304!chunkedupload 4a2a524b5147.jpg",
"extmetadata": {
"DateTime": {
"source": "mediawiki-metadata",
"hidden": "",
"value": "2019-03-14 18:08:10"
},
"CommonsMetadataExtension": {
"source": "extension",
"hidden": "",
"value": 1.2
},
"Assessments": {
"source": "commons-categories",
"hidden": "",
"value": ""
},
"Categories": {
"source": "commons-categories",
"hidden": "",
"value": ""
},
"ObjectName": {
"source": "mediawiki-metadata",
"hidden": "",
"value": "20190314180809!chunkedupload 6d04724f88bd"
}
},
"commonmetadata": [
{
"value": "371DB9CF4042631EC8B5E9963CA5AC16",
"name": "OriginalDocumentID"
},
{
"value": "Adobe Photoshop CC 2015 Windows",
"name": "Software"
}
],
"anon": "",
"timestamp": "2019-03-14T18:23:05Z",
"bitdepth": 8,
"mime": "image/jpeg",
"sha1": "d07dbfcb97861b23fbe6b33efb14856694458450",
"url": "https://test.wikipedia.org/wiki/Special:UploadStash/file/16gqn663shqw.pop712.42588.jpg",
"parsedcomment": "",
"userid": "None",
"metadata": [
{
"value": "371DB9CF4042631EC8B5E9963CA5AC16",
"name": "OriginalDocumentID"
},
{
"value": "Adobe Photoshop CC 2015 Windows",
"name": "Software"
},
{
"value": 2,
"name": "MEDIAWIKI_EXIF_VERSION"
}
],
"width": 600
},
"result": "Success"
}
}
|
Étape n°3 : dernier téléversement utilisant filekey pour sauvegarder le téléversement hors de la zone de réserve
Le résultat du téléversement final inclura l'objet imageinfo complet actuel, comparable à ce que vous obtiendriez avec un téléversement non segmenté.
| Résultat 3 |
|---|
{
"upload": {
"imageinfo": {
"mediatype": "BITMAP",
"user": "Mansi29ag",
"comment": "Upload Testing",
"height": 600,
"size": 48316,
"descriptionurl": "https://test.wikipedia.org/wiki/File:Testfile5.jpg",
"html": "<p>A file with this name exists already, please check <strong><a class=\"mw-selflink selflink\">File:Testfile5.jpg</a></strong> if you are not sure if you want to change it.\n</p>\n<div class=\"thumb tright\"><div class=\"thumbinner\" style=\"width:182px;\"><a href=\"/w/index.php?title=Special:Upload&wpDestFile=Testfile5.jpg\" class=\"new\" title=\"File:Testfile5.jpg\">File:Testfile5.jpg</a> <div class=\"thumbcaption\"></div></div></div>\n",
"canonicaltitle": "File:Testfile5.jpg",
"extmetadata": {
"DateTime": {
"source": "mediawiki-metadata",
"hidden": "",
"value": "2019-03-14 18:08:10"
},
"CommonsMetadataExtension": {
"source": "extension",
"hidden": "",
"value": 1.2
},
"Assessments": {
"source": "commons-categories",
"hidden": "",
"value": ""
},
"Categories": {
"source": "commons-categories",
"hidden": "",
"value": ""
},
"ObjectName": {
"source": "mediawiki-metadata",
"hidden": "",
"value": "20190314180809!chunkedupload 6d04724f88bd"
}
},
"commonmetadata": [
{
"value": "371DB9CF4042631EC8B5E9963CA5AC16",
"name": "OriginalDocumentID"
},
{
"value": "Adobe Photoshop CC 2015 Windows",
"name": "Software"
}
],
"sha1": "d07dbfcb97861b23fbe6b33efb14856694458450",
"width": 600,
"bitdepth": 8,
"mime": "image/jpeg",
"url": "https://upload.wikimedia.org/wikipedia/test/8/8e/Testfile5.jpg",
"parsedcomment": "Upload Testing",
"descriptionshorturl": "https://test.wikipedia.org/w/index.php?curid=0",
"userid": 42588,
"metadata": [
{
"value": "371DB9CF4042631EC8B5E9963CA5AC16",
"name": "OriginalDocumentID"
},
{
"value": "Adobe Photoshop CC 2015 Windows",
"name": "Software"
},
{
"value": 2,
"name": "MEDIAWIKI_EXIF_VERSION"
}
],
"timestamp": "2019-03-14T18:23:07Z"
},
"result": "Success",
"filename": "Testfile5.jpg"
}
}
|
Exemple de code
Python
"""
upload_file_in_chunks.py
MediaWiki API Demos
Demo of `Upload` module: Step-by-step process to upload a file in chunks
MIT license
"""
import os
import requests
S = requests.Session()
URL = "https://test.wikipedia.org/w/api.php"
# File path of the image to be uploaded
FILE_PATH = 'f.jpg'
FILE = open(FILE_PATH, 'rb')
FILE_SIZE = os.stat(FILE_PATH).st_size
# Bot credentials
BOT_USERNAME = 'enter_a_bot_username'
BOT_PASSWORD = 'enter_a_bot_password'
def read_chunks(file_object, chunk_size=5000):
"""Return the next chunk of the file"""
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
def fetch_login_token():
"""Retrieve a login token"""
params = {
"action": "query",
"meta": "tokens",
"type": "login",
"format": "json"
}
res = S.get(url=URL, params=params)
data = res.json()
return data["query"]["tokens"]["logintoken"]
def user_login(login_token, username, password):
"""Send a post request to login
Use of main account for login is not supported. Obtain credentials via
Special:BotPasswords (https://www.mediawiki.org/wiki/Special:BotPasswords)
for lgname & lgpassword """
params = {
"action": "login",
"lgname": username,
"lgpassword": password,
"format": "json",
"lgtoken": login_token
}
S.post(URL, data=params)
def fetch_csrf_token():
"""While logged in, retrieve a CSRF token"""
params = {
"action": "query",
"meta":"tokens",
"format":"json"
}
res = S.get(url=URL, params=params)
data = res.json()
return data["query"]["tokens"]["csrftoken"]
def upload_file_in_chunks(csrf_token):
"""Send multiple post requests to upload a file in chunks using `stash` mode.
Stash mode is used to build a file up in pieces and then commit it at the end
"""
chunks = read_chunks(FILE)
chunk = next(chunks)
# Parameters for the first chunk
params = {
"action": "upload",
"stash": 1,
"filename": "chunk_test.jpg",
"filesize": FILE_SIZE,
"offset": 0,
"format": "json",
"token": csrf_token,
"ignorewarnings": 1
}
index = 0
file = {'chunk':('{}.jpg'.format(index), chunk, 'multipart/form-data')}
index += 1
res = S.post(URL, files=file, data=params)
data = res.json()
# Pass the filekey parameter for second and further chunks
for chunk in chunks:
params = {
"action": "upload",
"stash": 1,
"offset": data["upload"]["offset"],
"filename": "chunk_test.jpg",
"filesize": FILE_SIZE,
"filekey": data["upload"]["filekey"],
"format": "json",
"token": csrf_token,
"ignorewarnings": 1
}
file = {'chunk':('{}.jpg'.format(index), chunk, 'multipart/form-data')}
index += 1
res = S.post(URL, files=file, data=params)
data = res.json()
# Final upload using the filekey to commit the upload out of the stash area
params = {
"action": "upload",
"filename": "chunk_test.jpg",
"filekey": data["upload"]["filekey"],
"format": "json",
"comment": "Upload Testing",
"token": csrf_token,
}
res = S.post(URL, data=params)
data = res.json()
def main():
""" Four-step process to uploading a file in chunks"""
login_token = fetch_login_token() # Step 1: Fetch login token
user_login(login_token, BOT_USERNAME, BOT_PASSWORD) # Step 2: Login
csrf_token = fetch_csrf_token() # Step 3: Fetch CSRF token
upload_file_in_chunks(csrf_token) # Step 3: Upload a file in chunks
if __name__ == "__main__":
main()
JavaScript
/*
upload_file_in_chunks.js
MediaWiki API Demos
Demo of `Upload` module: Step-by-step process to upload a file in chunks
MIT license
*/
var fs = require('fs'),
request = require('request').defaults({jar: true}),
url = "http://dev.wiki.local.wmftest.net:8080/w/api.php",
filename = "My.jpg";
// Step 1: GET request to fetch login token
function getLoginToken() {
var params_0 = {
action: "query",
meta: "tokens",
type: "login",
format: "json"
};
request.get({ url: url, qs: params_0 }, function (error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
loginRequest(data.query.tokens.logintoken);
});
}
// Step 2: POST request to log in.
// Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest(login_token) {
var params_1 = {
action: "login",
lgname: "bot_username",
lgpassword: "bot_password",
lgtoken: login_token,
format: "json"
};
request.post({ url: url, form: params_1 }, function (error, res, body) {
if (error) {
return;
}
getCsrfToken();
});
}
// Step 3: GET request to fetch CSRF token
function getCsrfToken() {
var params_2 = {
action: "query",
meta: "tokens",
format: "json"
};
request.get({ url: url, qs: params_2 }, function(error, res, body) {
if (error) {
return;
}
var data = JSON.parse(body);
upload(data.query.tokens.csrftoken);
});
}
// Step 4: POST request to upload a file
function upload(csrf_token) {
/*
Send multiple post requests to upload a file in chunks using `stash` mode.
Stash mode is used to build a file up in pieces and then commit it at the end
*/
var fileSizeInBytes = fs.statSync(filename).size;
var headers = {
"Content-Type": "multipart/form-data"
};
var params_3 = {
action: "upload",
stash: "1",
filename: "Sandboxfile1.jpg",
filesize: fileSizeInBytes,
offset: "0",
ignorewarnings: "1",
token: csrf_token,
format: "json"
};
var file = {
file: fs.createReadStream(filename)
};
var formData = Object.assign( {}, params_3, file );
request.post({ url: url, headers: headers, formData: formData }, function (error, res, body) {
body = JSON.parse(body);
if (error) {
return;
}
params_4 = {
action: "upload",
filename: "Sandboxfile1.jpg",
filekey: body.upload.filekey,
comment: "Upload Testing",
token: csrf_token,
format: "json"
};
request.post({ url: url, form: params_4 }, function (error, res, body) {
body = JSON.parse(body);
if (error) {
return;
}
console.log(body.upload.result);
});
});
}
// Start From Step 1
getLoginToken();
MediaWiki JS
/*
upload_file_in_chunks.js
MediaWiki API Demos
Demo of `Upload` module: Step-by-step process to upload a file in chunks
MIT license
*/
var param = {
filename: 'TestFile_2.jpg',
format: 'json',
ignorewarnings: 1
},
fileInput = $( '<input/>' ).attr( 'type', 'file' ),
submitBtn = $( '<input/>' ).attr( 'type', 'button' ).attr( 'value', 'Upload' ),
api = new mw.Api();
$( '#bodyContent' ).append( [ fileInput, submitBtn ] );
$( submitBtn ).on( 'click', function () {
api.uploadToStash( fileInput[ 0 ], param ).done( function ( finish ) {
finish( param ).done( function ( data ) {
console.log( data.upload.filename + ' has sucessfully uploaded.' );
} ).fail( function ( data ) {
console.log( data );
} );
} );
} );
Erreurs possibles
| Code | Information |
|---|---|
| mustbeloggedin | Vous devez être connecté pour téléverser ce fichier. |
| permissiondenied | Le groupe utilisateur dont vous faites partie n'a pas les droits upload.
|
| fileexists-shared-forbidden | Un fichier portant ce nom existe déjà dans le dépôt de fichiers partagé. |
| chunk-too-small | La taille minimale d’un segment est de n octet pour les segments hors le dernier. |
| stashfailed | Ce fichier ne passe pas la vérification des fichiers. |
| verification-error | Les données sont soit corrompues ou l'extension et le type MIME ne correspondent pas. |
| windows-nonascii-filename | Le serveur ne prend pas en charge les noms de fichier avec des caractères spéciaux. |
| copyuploaddisabled | Le téléversement par URL est désactivé. |
Voir aussi la section des Avertissements ci-dessus.
Historique des paramètres
- v1.21:
asynccheckstatusajouté - v1.19:
offsetfilesizechunkajouté - v1.18:
stashfilekeyajouté - v1.17:
stash,statuskey,leavemessage,asyncdownloadajouté - v1.18:
sessionkeyobsolète - v1.17:
watchobsolète
Notes supplémentaires
- Pour vérifier l'état d'un téléversement en cours vers l'espace de réserve ou la progression d'un fichier en cours de public1tion à partir de la réserve, envoyez une demande POST :
| Résultat |
|---|
{
"upload": {
"stage": "uploading",
"offset": 5000,
"result": "Continue"
}
}
|
- Voici un exemple de POST multiparties sur
/api.php?action=upload, représentant un seul bloc. Notez que vous devez décompresser le fichier pour qu'il apparaisse dans le Wiki une fois que vous avez téléversé tous vos morceaux.
| Contenu étendu |
|---|
User-Agent: <YOUR USER-AGENT> Content-Type: multipart/form-data; boundary=--24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Host: commons.wikimedia.org Cookie: <cookies> Connection: Keep-Alive --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="filename" Content-Length: 20 UploadTest356456.png --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="offset" Content-Length: 1 0 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="format" Content-Length: 4 json --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="ignorewarnings" Content-Length: 1 1 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="filesize" Content-Length: 3 971 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="token" Content-Length: 42 <YOUR_CSRF_TOKEN_HERE> --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="stash" Content-Length: 1 1 --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b Content-Disposition: form-data; name="chunk"; filename="1.png" Content-Type: application/octet-stream Content-Length: 971 <RAW_BYTES_FROM_FILE_HERE> --24b7c3bb-fb4d-45c3-937c-11c2e0c2525b-- |
Voir aussi
- API:Authentification - Permet à un utilisateur de se connecter
- API:Import - Permet à un utilisateur d'importer une page
- Manuel:$wgRateLimits - Limites du téléversement selon les groupes d'utilisateurs