Jump to content

Configuration du téléversement de fichiers

From mediawiki.org
This page is a translated version of the page Manual:Configuring file uploads and the translation is 99% complete.
Outdated translations are marked like this.

MediaWiki prend en charge le téléversement et l'intégration de fichiers multimédia. Cette page décrit les aspects techniques de cette propriété, voir Manuel:Gestion des images et Aide:Images pour les informations d'usage général.

A partir de la version 1.1 de MediaWiki, les téléversements de fichiers sont initialement désactivés par défaut, pour des questions de sécurité. Le téléversement de fichiers peut être activé via un paramètre de configuration, bien qu'il soit recommandé de vérifier d'abord certains pré-requis.

Prérequis

Vérifier que les téléversements sont activés en PHP

Les éléments suivants doivent être paramétrés dans le fichier php.ini  :

file_uploads = On

Si cela n'est pas paramétré, les scripts PHP ne pourront pas utiliser les fonctions de téléversement, et les téléversements de MediaWiki ne seront pas activés.

Si la directive open_basedir est paramétrée, elle devra inclure à la fois le fichier de destination de téléversement de votre installation MediaWiki (« {$IP}/images ») et le 'upload_tmp_dir' (dossier système par défaut si non paramétré). Si c'est le cas, vérifiez également si votre hôte a correctement configuré 'sys_temp_dir', car parfois il est aussi oublié et vous ne pouvez pas écrire du tout les fichiers temporaires (téléversement, session ou tout autre fichier tmp).

L'ajout de la 'upload_tmp_dir' peut éviter les messages comme « Could not find file "/var/tmp/php31aWnF » (où dans cet exemple 'upload_tmp_dir' est '/var/tmp'). Apprenez-en davantage sur le téléversement de fichiers sur File upload basics et en particulier move_uploaded_file().

La valeur formelle pour la variable est une expression booléenne. PHP traite chaque chaîne non reconnue comme la valeur 'False' comme étant 'true', par conséquent la valeur 'on', souvent utilisée, renvoie le même résultat.

Vérification pour les utilisateurs de Windows et IIS

Paramétrez %SystemRoot%\TEMP pour donner au compte d'invité internet (IUSR_MachineName, ou IUSR pour IIS 7+) les droits de : lecture, écriture et exécution;

Vérification de la sécurité du répertoire

Le répertoire de téléversement doit être configuré pour qu'il ne soit pas possible pour un utilisateur final de téléverser et d'exécuter d'autres scripts, qui pourraient alors s'octroyer un accès à votre répertoire web et endommager votre wiki ou votre site web.

Paramétrez le dossier /images (ou le dossier /uploads dans les précédentes versions) pour avoir la permission 755.

  • L'Utilisateur peut lire, écrire et exécuter;
  • Le Groupe peut lire et exécuter;
  • Les Autres peuvent lire et exécuter.
Seuls les répertoires doivent avoir les droits d'exécution. Les fichiers ne doivent pas avoir les droits d'exécution. Sous Linux, pour supprimer les droits d'exécution de tous les fichiers d'un répertoire, et pour les ajouter au répertoire et à tous les sous répertoires : chmod -x+X uploads_folder -R

En cas d'utilisation de SELinux , vérifiez les paramètres ACLs correspondants (voir la documentation).

Vérifier la sécurité du serveur web

See Manual:Security#Upload security for changes to make to your webserver configuration to prevent uploaded files from executing code or having browsers execute malicious files.

  • Restreindre le listage du répertoire des images

Si vous ne souhaitez pas qu'un utilisateur public puisse lister votre répertoire d'images, une option est de le paramétrer dans votre configuration apache:

        <Directory /var/www/wiki/images>
                Options -Indexes
        </Directory>

Vérifier le fichier .htaccess

Le répertoire images du dossier d'installation MediaWiki contient un fichier .htaccess contenant des paramètres de configuration. Le but de ce fichier est de rendre le dossier de téléversement plus sécurisé, et si vous placez votre répertoire de téléversement ailleurs, il est recommandé de copier également le fichier .htaccess vers un autre endroit, ou d'appliquer cette configuration directement sur le serveur. Toutefois, certains de ces paramètres de configuration peuvent être à l'origine de conflits ou d'erreurs, selon la façon dont le serveur est configuré.

Quelques éléments à prendre en compte:

  • Si le serveur ne permet pas de modifier ou de retirer des paramètres des fichiers .htaccess, demander l'accès à un fichier placé dans ce dossier peut occasionner l'erreur générique "HTTP 500 error". Si tel est le cas, vous devrez décommenter les lignes, et appliquer ces instructions directement sur les fichiers de configuration du serveur. Les instructions qui ont le plus de chance de causer des problèmes sont AddType - qui empêche les fichiers HTML et PHP d'être renvoyés en HTML - , et php_admin_flag - qui empêche les fichiers PHP d'être analysés et exécutés en tant que tels sur le serveur.

Paramétrer le téléversement sur on/off

Version de MediaWiki :
1.5

Dans MediaWiki version 1.5 et supérieures, l'attribut qui doit être paramétré est dans LocalSettings.php et $wgEnableUploads est fixé de la manière suivante:

$wgEnableUploads = true; # Activer les téléversements

Pour désactiver la fonctionalité de téléversement, initialisez l'attribut à 'false':

$wgEnableUploads = false; # Désactiver les téléversements

Utilisation d'un répertoire central

InstantCommons est une fonctionalité, activée par un changement dans la configuration, qui vous donne un accès immédiat aux millions de fichiers libres (dont la licence est libre) de Wikimedia Commons.

Permissions de téléversement

Par défaut, tous les utilisateurs enregistrés peuvent téléverser des fichiers. Pour limiter cela, vous devez modifier $wgGroupPermissions  :

  • Pour empêcher les utilisateurs standards de téléverser des fichiers :
    $wgGroupPermissions['user']['upload'] = false;
  • Pour créer un groupe spécial nommé « uploadaccess », et autoriser les membres de ce groupe à téléverser des fichiers :
    $wgGroupPermissions['uploadaccess']['upload'] = true;
  • Pour autoriser les utilisateurs « autoconfirmés » (non débutants) à téléverser des fichiers :
    $wgGroupPermissions['autoconfirmed']['upload'] = true;

Le droit de remplacer des fichiers existants est géré par une permission spéciale, appelée reupload:

  • Pour empêcher les utilisateurs standards d'effacer des fichiers existants :
    $wgGroupPermissions['user']['reupload'] = false;
  • Pour autoriser les utilisateurs « autoconfirmés » (non débutants) à remplacer des fichiers existants:
    $wgGroupPermissions['autoconfirmed']['reupload'] = true;

Si un fichier de dépôt extérieur (ForeignFileRepo) est configuré, le droit de le remplacer localement est géré par une permission spéciale, appelée reupload-shared:

  • Pour empêcher les utilisateurs standards d'effacer localement les fichiers du dépôt :
    $wgGroupPermissions['user']['reupload-shared'] = false;
  • Pour autoriser les utilisateurs « autoconfirmés » (non débutants) de remplacer localement les fichiers du dépôt :
    $wgGroupPermissions['autoconfirmed']['reupload-shared'] = true;

Voir Manuel:Droits utilisateurs pour plus de détails sur les droits utilisateur, et Manuel:Empêcher l'accès pour plus d'informations sur les restrictions d'accès.

Configuration des types de fichiers

Vous pouvez ajouter $wgFileExtensions dans le fichier LocalSettings.php pour autoriser les téléversements d'autres types de fichiers souhaités. Par exemple, vous pouvez changer la ligne de $wgFileExtensions pour obtenir quelque chose comme

$wgFileExtensions = [ 'png', 'gif', 'jpg', 'jpeg', 'doc',
	'xls', 'mpp', 'pdf', 'ppt', 'tiff', 'bmp', 'docx', 'xlsx',
	'pptx', 'ps', 'odt', 'ods', 'odp', 'odg'
];

ou

$wgFileExtensions = array_merge( $wgFileExtensions, [
	'doc', 'xls', 'mpp', 'pdf', 'ppt', 'xlsx', 'jpg', 
	'tiff', 'odt', 'odg', 'ods', 'odp'
] );

ou

# Ajouter le nouveaux types à la liste existante depuis DefaultSettings.php
$wgFileExtensions[] = 'docx';
$wgFileExtensions[] = 'xls';
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'mpp';
$wgFileExtensions[] = 'odt';
$wgFileExtensions[] = 'ods';

Cependant, certaines extensions de fichier sont interdites ($1, antérieurement $2 pour MediaWiki 1.36 et plus ancien) et ne peuvent pas être téléversées, même si elles sont ajoutées à $wgFileExtensions. Pour téléverser les fichiers dont les extensions sont interdites, vous devez modifier $wgProhibitedFileExtensions . Par exemple, pour autoriser les utilisateurs à téléverser des exécutables:

$wgFileExtensions[] = 'exe';
$wgProhibitedFileExtensions = array_diff( $wgProhibitedFileExtensions, [ 'exe' ] );

De plus, $wgMimeTypeExclusions (antérieurement $3) empêche le téléversement de certains types de fichiers basés sur le type de MIME; les fichiers .zip, par exemple, sont interdits à cause de leur type MIME (MediaWiki version 1.14 à 1.17).

Vous pouvez aussi paramétrer $wgStrictFileExtensions

$wgStrictFileExtensions = false;

pour autoriser le téléversement de la plupart des types de fichiers. Cependant, les types de fichiers et les types MIME interdits ne seront pas encore permis.

Avertissement Avertissement : Initialiser $wgStrictFileExtensions à false, ou modifier $wgProhibitedFileExtensions pourrait vous exposer personnellement (ou vos utilisateurs) à des risques de sécurité.

Si vous recevez l'erreur "The file is corrupt or has an incorrect extension", assurez-vous que la détection des types MIME fonctionne correctement.

Si vous décidez d'autoriser n'importe quel type de fichier, assurez-vous que votre détection MIME fonctionne et pensez à passer un antivirus sur les téléversements .

Pour activer l'extension zip (testée avec MediaWiki v1.19.23) le paramétrage suivant sera nécessaire dans le fichier LocalSettings.php  :

$wgFileExtensions[] = 'zip';
// $wgTrustedMediaFormats[] = 'ARCHIVE';
$wgTrustedMediaFormats[] = 'application/zip';


Affichage des vignettes

Pour les informations concernant le rendu automatique des images ou la génération des vignettes, voir Vignettes des images . Pour les problèmes liés aux vignettes, voir Vignettes d'images non opérationnelles ou absentes.

Version de MediaWiki :
1.11

Si le fichier n'est pas visuel (comme une image ou une vidéo) une icône de fichier est utilisée en remplacement. Ces icônes sont générées par la fonction iconThumb() de la classe File du groupe FileRepo. Les icônes sont rangées dans « $wgStyleDirectory/common/images/icons/ » dans un format « fileicon-$extension.png » .

Définir la taille maximale du fichier téléversé

Les navigateurs indiquent au serveur la taille du fichier à transférer avant de l'émettre.

Si la taille du téléversement est trop grande, la cible rejette l'opération et celle-ci échoue en retournant des erreurs différentes en fonction du niveau sur lequel la limite a été imposée :

  • si la limite est détectée au niveau du serveur (nginx, Apache) sur le maximum de données transmises, l'échec peut se traduire simplement par l'erreur HTTP 500 ou HTTP 413 – Request entity too large.
  • si la limite a été détectée au niveau PHP, (paramètre post_max_size), vous pouvez obtenir une erreur générique HTTP 500 error (ou simplement une page blanche), sinon MediaWiki devrait fournir un message plus parlant.
post_max_size et upload_max_filesize dans php.ini

Par défaut, le code de configuration dans php.ini limite la taille des fichiers à téléverser à 2 mégabytes (et la taille maximum pour une opération POST à 8 mégabytes). Pour permettre le téléversement de fichiers plus longs, modifiez ces paramètres dans php.ini:

Ceci peut nécessiter un accès root sur le serveur. (Si vous vous trouvez sur un hôte partagé, contactez votre administrateur système.)

Si vous augmentez la taille maximale du fichier à télécharger à une valeur supérieure à 100MB, vous devrez ajouter dans LocalSettings.php , $wgMaxUploadSize avec la nouvelle valeur choisie pour les fichiers à télécharger.
Recherche du fichier php.ini

L'endroit où se trouve le fichier php.ini dépend de la distribution que vous utilisez. Voir Manuel:Php.ini pour savoir comment trouver le php.ini correct utilisé par votre serveur web (contrairement au php.ini utilisé par le binaire en mode ligne de commande).

Multiples sites web hébergés sur un serveur

Si vous avez plus d'un site web hébergé sur un serveur et que vous voulez faire les modifications uniquement pour MediaWiki, insérez dans votre /etc/apache2/sites-enabled/your_wiki_site.com, dans <Virtual Host> :

php_value upload_max_filesize 100M
php_value post_max_size 100M

Les deux initialisations ci-dessus fonctionnent également dans un fichier .htaccess si votre site utilise mod_php. Si votre site utilise PHP >= 5.3 et le permet, vous pouvez à la place, mettre les directives de php.ini dans des fichiers .user.ini.

limites des serveurs web

Votre serveur web peut imposer d'autres limites sur la taille des fichiers autorisés pour le téléversement. Pour Apache, un des paramètres importants est LimitRequestBody. [1] Pour, client_max_body_size est la valeur adéquate.[2] Pour Lighttpd, server.max-request-size est ce qu'il faut éventuellement modifier.[3]

Après avoir modifié votre php.ini ou la configuration de votre serveur web, vous devrez redémarrer Apache ou IIS.

Ubuntu 16.04: sudo service apache2 restart

Il est également possible d'avoir à redémarrer php5-fpm si vous modifiez la configuration PHP (ou celle du serveur ngingx ?).

(sudo /etc/init.d/php5-fpm pour le redémarrage sous Linux, par exemple.)

avertissement de téléversement de fichiers trop volumineux

MediaWiki lui-même émét un avertissement si vous essayez de téléverser des fichiers plus gros que ceux qui sont spécifiés par l'option $wgUploadSizeWarning . Ceci est indépendant de la limite imposée en dur par PHP.

limites de téléversement temporaire

Les modifications temporaires des limites de téléversement (quand vous utilisez de multiple wikis sur une ferme, par exemple) peuvent être modifiées en ajoutant les lignes :

ini_set( 'post_max_size', '50M' );
ini_set( 'upload_max_filesize', '50M' );

au fichier de configuration LocalSettings.php de MediaWiki pour chaque wiki. Dans cet exemple la limite PHP est fixée à 50 Mb. Notez que ces initialisations ne vont pas remplacer les valeurs maximales fixées ci-dessus (parce que les fichiers système php.ini et apache2 php.ini définissent le maximum absolu). Cette méthode définit les maximums inférieurs au maximum absolu.

limite de téléversement IIS7
Par défaut, IIS7[4] sur Windows 2008 permet seulement 30MB de téléversement via une application web. Le fichiers plus longs vont retourner une erreur 404 après le téléversement. Si vous avez ce problème, vous pouvez le résoudre en augmentant la taille maximale des fichiers en ajoutant le code suivant à ‎<system.webServer>, dans le fichier web.config :
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="50000000" />
  </requestFiltering>
</security>

Avec la taille ci-dessus maxAllowedContentLength, les utilisateurs peuvent téléverser des fichiers qui ont une taille de 50.000.000 octets (50 MB). Cette initialisation va fonctionner immédiatement sans avoir besoin de redémarrer les services IIS. Le fichier web.config est situé dans le répertoire racine de votre site web.

Pour permettre le téléversement de fichiers jusqu'à 2 Giga:

ajoutez les lignes suivantes à LocalSettings.php :

$wgUploadSizeWarning = 2147483647;
$wgMaxUploadSize = 2147483647;

Modifiez aussi les lignes suivantes de php.ini :

memory_limit = 2048M (cette ligne est peut être inutile)
post_max_size = 2048M
upload_max_filesize = 2048M

Dans le fichier IIS web.config, remplacez la valeur de maxRequestLength. Par exemple, l'entrée suivante dans web.config permet aux fichiers qui font 2 gigabytes (GB) ou moins, d'être téléversés :

<httpRuntime maxRequestLength="2097151" executionTimeout="18000"/>

Avec IIS 7, vous avez aussi besoin de le configurer pour autoriser les téléversements volumineux. On trouve cela en cliquant sur « Request Filtering → Edit Feature Settings » dans la section IIS au milieu de la fenêtre. Fixer le champ « Maximum allowed content length (Bytes) » (taille maximale du contenu) à 2147482624. Si vous ne voyez pas « Request Filtering » (demander le filtrage) dans la section IIS, il faut faire l'activation via Internet Information Services → World Wide Web Services → Security dans la zone « Turn Windows features on or off » du Control Panel.

Si le conseil ci-dessus ne permet pas de longs téléversements, alors ouvrez une fenêtre de commande et exécutez la commande suivante :

%windir%\system32\inetsrv\appcmd set config -section:requestFiltering -requestLimits.maxAllowedContentLength: 2147482624

Téléversement direct à partir d'une URL (sideloading)

Si vous voulez autoriser un utilisateur à téléverser directement des fichiers à partir d'une URL, au lieu d'utiliser un fichier se trouvant en local sur son ordinateur, fixez $wgAllowCopyUploads = true.

Par défaut, les téléversements par URL ne sont possibles uniquement qu'en utilisant l'API (ou des extensions telles que UploadWizard ). Pour rendre l'option utilisable, dans Special:Upload, vous devez initialiser également $wgCopyUploadsFromSpecialUpload à true. Sur l'IHM de téléversement, vous verrez ensuite un champ supplémentaire pour l'URL, sous le champ usuel du nom de fichier. Le champ URL est grisé par défaut, mais peut être activé en sélectionnant le bouton radio (case à cocher) à gauche du champ.

Pour utiliser cette fonctionalité, les utilisateurs doivent avoir le droit utilisateur upload_by_url. Ce droit était alloué aux administrateurs (sysops) par défaut jusque MediaWiki 1.20 mais actuellement il doit être attribué explicitement. Pour autoriser ceci aux utilisateurs standards, fixez

 $wgGroupPermissions['user']['upload_by_url'] = true;

Rappelez-vous qu'en autorisant les téléversements directement à partir d'un point arbitraire du web, vous risquez de ramenter un contenu aléatoire, du matériel non désiré, et cela pourrait être confondu avec une invitation à téléverser quelque chose que tout le monde pourrait voir sur le web.

La prise en charge de cURL de PHP doit être autorisée pour que cette fonctionalité soit opérationnelle. Configurez votre PHP lors de l'installation en utilsant l'option --with-curl .
Si votre serveur accède à internet via un proxy alors $wgHTTPProxy doit être initialisé en conséquence. Soit vous le fournissez directement, soit si votre serveur fournit la variable d'environnement http_proxy, allez voir votre phpinfo(), ensuite vous pourrez utiliser le code suivant dans votre LocalSettings.php :
/*
 * Proxy à utiliser pour les requêtes cURL.
 */
if ( isset( $_ENV['http_proxy'] )) $wgHTTPProxy = $_ENV['http_proxy'];

Téléversements en nombre

Nombre d'outils sont disponibles pour téléverser des fichiers multiples en une seule fois plutôt que au coup par coup :

Extension Description Statut de parution Prérequis
Extension:UploadWizard/fr Utilisé sur Wikimedia Commons Stable MediaWiki 1.23+
Extension:MsUpload Permet à un utilisateur de téléverser des fichiers multiples même par glisser-déposer. Stable 1.32+
Extension:SimpleBatchUpload Téléversement de base, sans fioritures, de plusieurs fichiers sur MediaWiki Stable 1.31+
Extension:VisualData/File_upload Includes a fully-configurable multiple file upload with filename formula and CRUD operations Stable 1.35+
Commonist (lien externe vers Wikimedia Commons) Nécessite le téléversement du fichier via api.php.
importImages.php "Placez les fichiers sur le serveur à un emplacement accessible en lecture et executez le script maintenance/importImages.php à partir de la ligne de commande."[5]

Répertoire de téléversement

Quand une image est téléversée, plusieurs choses sont créées :

  1. Un article de l'espace de noms des fichiers ayant le même nom de fichier, c'est à dire File:MyPicture.png. Cette page est enregistrée et peut être modifiée comme tout autre page.
  2. Le fichier lui-même est rangé dans le dossier du système de fichiers, qui est configuré dans $wgUploadDirectory ou vers un de ses sous-répertoires (voir ci-dessous).
  3. Si les vignettes sont autorisées, les versions vignettes du fichier seront créées quand elles seront nécessaires (comme pour leur utilisation sur la page de description de fichier). Elles sont rangées dans le répertoire thumb du dossier image, dans un répertoire séparé pour chaque fichier principal.

Si $wgHashedUploadDirectory est autorisé (par défaut), MediaWiki crée plusieurs sous-répertoires dans le dossier des images.

Si $wgHashedUploadDirectory est fixé à true, les fichiers téléversés seront distribués dans les sous répertoires de $wgUploadDirectory basés sur les deux premiers caractères de la valeur de hachage md5 du nom de fichier (par exemple $IP/images/a/ab/foo.jpg). La création de tels sous-répertoires est gérée automatiquement. Ceci est utilisé pour éviter d'avoir trop de fichiers dans un dossier parce que certains systèmes de fichiers peinent à réagir quand le nombre de fichiers dans un dossier devient trop grand.

Si vous ne maintenez qu'un petit wiki avec quelques images téléversées, vous pouvez désactiver cette facilité avec $wgHashedUploadDirectory = false; toutes les images sont téléversées alors dans $wgUploadDirectory lui-même (par exemple $IP/images/foo.jpg).

Les sites multiwiki

  • Assurez-vous d'avoir modifié l'emplacement du site dans LocalSettings.php de, par exemple /var/lib/mediawiki à là où se trouve votre installation, et d'avoir créé un dossier d'images accessible en écriture (pour le reste, vous pouvez utiliser les symlink).

Ne pas faire ainsi va mystérieusement casser le téléversement des images.

Configurer le formulaire de téléversement

Le message du formulaire de téléversement fourni avec l'installation par défaut de MediWiki (qui apparaît quand vous cliquez sur le lien « Téléverser un fichier » ou que vous allez sur le lien Special:Upload ) peut ne pas vous convenir.

Dans ce cas vous pouvez modifier le contenu de MediaWiki:Uploadtext et fournir votre propre texte. Si votre site wiki est multilangue n'oubliez pas de modifier les versions traduites comme MediaWiki:Uploadtext/de.

Sur la page MediaWiki:Licenses, vous pouvez configurer une liste déroulante de licences pour les téléversements sur votre site. Voir la documentation de cette fonctionnalité.

Notez bien que les versions traduites comme MediaWiki:Licenses/de ne fonctionneront pas par défaut. Pour les autoriser vous devez configurer la variable $wgForceUIMsgAsContentMsg .

Modifiez MediaWiki:Upload-default-description pour ajouter un texte initial au champ « Summary » de votre formulaire de téléversement (par exemple le site de votre wiki possède un modèle universel pour le résumé des téléversements et vous voulez que chacun utilise ce modèle).

Problèmes connus sous Windows

Exécuter MediaWiki sur un serveur Windows impose certaines restrictions pour le nom des fichiers, à cause d'un bogue dans PHP. PHP ne peut pas gérér les noms de fichiers possèdant des caractères non-ascii, et MediaWiki refusera de téléverser les fichiers contenant de tels caractères afin d'empêcher l'échec du téléversement (tâche T3780), avec le message Ce wiki ne prend pas en charge les noms de fichiers avec des caractères spéciaux..

Depuis MediaWiki 1.31 MediaWiki peut gérer des noms de fichiers avec des caractères non Ascii si vous utilisez PHP 7.1 ou plus récent.

Problèmes connus avec les noms de bases de données comportant des caractères non alphanumériques

Si $wgDBname contient des caractères non alphanumériques, le téléversement peut échouer avec des erreurs comme Could not create directory « mwstore://local-backend/local-public/<path> ».. Ceci est causé par un contrôle interne sur le nom valide du conteneur pour le fichier de sauvegarde, mais il est construit en utilisant $wgDBname.

Depuis MediaWiki 1.26, les téléversements sont permis si $wgDBname contient des points.

Voir aussi

Références

  1. core - Apache HTTP Server Version 2.4 - LimitRequestBody Directive, Apache manual
  2. client_max_body_size, manuel Nginx
  3. server.max-request-size, manuel Lighthttpd
  4. IIS7 est une nouvelle révision (version 7.0) du Internet Information Services qui fait partie des versions Windows Vista et Windows Server ultérieures.
  5. http://xpt.sourceforge.net/techdocs/language/wiki/wikimedia/wkm07-MediaWikiImport/index.html#mass_image_upload_zip_