Maison > développement back-end > tutoriel php > phpmaster | Téléchargement de fichiers avec PHP

phpmaster | Téléchargement de fichiers avec PHP

William Shakespeare
Libérer: 2025-03-03 08:28:10
original
618 Les gens l'ont consulté

phpmaster | Uploading Files with PHP

Téléchargement de fichiers PHP: créez un système de téléchargement sûr et fiable

Les images d'albums en ligne, les pièces jointes de messagerie et les fichiers de données d'application de traitement par lots ont une chose en commun: ils doivent tous télécharger des fichiers sur Internet via le navigateur Web de l'utilisateur. La fonction de téléchargement de fichiers est une partie importante de nombreux sites Web et applications Web qui sont utilisés chaque jour. Cet article vous montrera comment ajouter une prise en charge de téléchargement de fichiers sur votre site Web à l'aide de PHP.

Points clés

  • L'ajout de prise en charge de téléchargement de fichiers dans PHP nécessite la création d'un formulaire HTML pour les utilisateurs et un script PHP pour le traitement des fichiers téléchargés sur le serveur. L'élément <form></form> doit utiliser la méthode Post et définir la propriété ENCTYPE sur les données multipart / format.
  • Les fichiers téléchargés sont d'abord stockés dans un répertoire temporaire. Le script PHP responsable de la gestion des soumissions de formulaires valide le fichier et le traite, le déplaçant généralement d'un emplacement temporaire à un emplacement plus permanent.
  • Les informations sur les téléchargements de fichiers sont fournies via des tableaux multidimensionnels $_FILES. La fonction move_uploaded_file() déplace le fichier téléchargé d'un emplacement temporaire à un emplacement permanent et effectue des vérifications supplémentaires pour s'assurer que le fichier est en effet téléchargé via la demande de post HTTP.
  • Il existe un risque de sécurité pour les téléchargements de fichiers. Pour atténuer ces risques, vous pouvez vérifier le type de fichiers téléchargés, imposer des restrictions strictes au trafic de téléchargement et rechercher des virus. Il est également important d'assurer un nom de fichier sécurisé en remplaçant tous les caractères qui ne sont pas des lettres, des chiffres ou un ensemble très limité de marques de ponctuation par un soulignement.

Prérequis

Le téléchargement de fichiers de traitement n'est pas difficile, mais il y a quelques petits détails qui doivent être corrects, sinon le téléchargement échouera. Tout d'abord, vous devez vous assurer que PHP est configuré pour permettre des téléchargements. Vérifiez votre fichier php.ini et vérifiez que la directive File_uploads est définie sur ON.

<code>file_uploads = On</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Les fichiers téléchargés sont d'abord stockés dans un répertoire temporaire (ne vous inquiétez pas ... votre script PHP peut ensuite déplacer des fichiers vers un emplacement plus permanent par la suite). Par défaut, l'emplacement initial est le répertoire temporaire par défaut du système. Vous pouvez spécifier différents répertoires à l'aide de la directive upload_tmp_dir dans php.ini. Dans tous les cas, vous devez vérifier que le processus PHP a les autorisations appropriées pour écrire dans le répertoire que vous utilisez.

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Après avoir confirmé que la configuration permet au serveur d'accepter les fichiers téléchargés, vous pouvez vous concentrer sur les détails HTML. Comme la plupart des autres interactions côté serveur de HTML, le téléchargement de fichiers utilise des formulaires. Il est très important que votre élément <form></form> doit utiliser la méthode post-post et définir la propriété ENCTYPE sur les données multipartiales / formulaires.

Copier après la connexion
Copier après la connexion

Écriture d'un script de téléchargement de processus

Selon votre propre expérience et les exigences mentionnées à l'heure actuelle, vous avez peut-être deviné le processus de téléchargement de fichiers.

  • Les visiteurs affichent des pages HTML contenant des formulaires spécifiquement utilisés pour prendre en charge les téléchargements de fichiers.
  • Le visiteur fournit le fichier qu'il souhaite télécharger et soumet le formulaire.
  • Le navigateur code le fichier et l'envoie dans le cadre d'une demande de poste émise au serveur.
  • PHP reçoit des soumissions de formulaires, décode le fichier et l'enregistre dans un emplacement temporaire sur le serveur.
  • Responsable de la gestion du fichier de validation de script PHP pour la soumission et le traitement du formulaire d'une manière ou d'une autre, le déplaçant généralement d'un emplacement temporaire à un emplacement plus permanent.

L'ajout de prise en charge de téléchargement de fichiers vous oblige à créer un formulaire HTML à présenter à l'utilisateur et un script PHP pour gérer les fichiers téléchargés sur le serveur.

html

Le formulaire HTML fournit l'interface pour que l'utilisateur lance le téléchargement de fichiers. N'oubliez pas que l'attribut de méthode de l'élément <input> doit être défini sur le post et que l'attribut ENCTYPE doit être défini sur multipart / formulaire de forme. Un élément de fichier <input> fournit un champ qui spécifie le fichier à télécharger. Comme tout autre élément de formulaire, il est important de fournir l'attribut de nom afin que vous puissiez le référencer dans un script PHP qui traite le formulaire. Voici un exemple de marquage pour un formulaire de téléchargement de fichiers de base:

<code>file_uploads = On</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il convient de noter que différents navigateurs rendront les champs de fichiers de différentes manières. IE, Firefox et l'opéra l'affichent sous forme de champs de texte avec des boutons marqués parcourir ou sélectionner à côté d'eux. Safari le rend comme un bouton marqué uniquement en tant que fichier de sélection. Ce n'est généralement pas un problème car l'utilisateur est habitué à la façon dont le champ est rendu dans le navigateur de son choix et sait comment l'utiliser. Cependant, vous rencontrez parfois des clients ou des concepteurs qui insistent pour le présenter d'une manière ou d'une autre. Pour des raisons de sécurité imposées par le navigateur, le nombre de CSS et JavaScript qui peuvent être appliqués aux champs de fichiers est très limité. Les champs de fichiers stylés peuvent être difficiles. Si l'apparence est importante pour vous, je vous suggère de consulter le type d'entrée stylé de Peter-Paul Koch = "fichier".

php

Les informations sur les téléchargements de fichiers sont fournies via des tableaux multidimensionnels $_FILES. Ce tableau est indexé par le nom attribué aux champs de fichiers dans le formulaire HTML, tout comme $_GET et $_POST indexé par le nom. Ensuite, le tableau de chaque fichier contient l'index suivant:

  • $_FILES["myFile"]["name"] stocke le nom de fichier d'origine du client.
  • $_FILES["myFile"]["type"] Le type MIME qui stocke le fichier.
  • $_FILES["myFile"]["size"] Taille du fichier en octets.
  • $_FILES["myFile"]["tmp_name"] Le nom du fichier temporaire est stocké.
  • $_FILES["myFile"]["error"] Stockez tous les codes d'erreur générés lors du transfert.
La fonction

move_uploaded_file() dérange le fichier téléchargé d'un emplacement temporaire à un emplacement permanent. Vous devez toujours utiliser des fonctions comme move_uploaded_file() au lieu de copy() et rename() à cette fin, car il effectue des vérifications supplémentaires pour vous assurer que le fichier est en effet téléchargé via la demande HTTP Post. Si vous prévoyez d'enregistrer des fichiers avec le nom de fichier d'origine fourni par l'utilisateur, il est préférable de vous assurer que cela est sûr. Le nom de fichier ne doit contenir aucun caractères qui peut affecter le chemin de destination, tel que les barres obliques. Le nom ne doit pas non plus provoquer l'écrasement des fichiers existants avec le même nom (sauf si la conception de votre application le fait). Je m'assure un nom de fichier sûr en remplaçant tout non-lettre, numéro ou un ensemble très limité de caractères de ponctuation par un soulignement, puis ajoutant des nombres incrémentés lorsque le fichier au même nom existe déjà. Voici un exemple de réception et de traitement des téléchargements de fichiers PHP:

<code>file_uploads = On</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce code garantit d'abord qu'il n'y a pas d'erreurs dans le téléchargement du fichier. Il détermine ensuite le nom de fichier sécurisé (comme je viens de le mentionner) et utilise move_uploaded_file() pour déplacer le fichier vers son répertoire final. Enfin, appelez chmod() pour garantir que l'accès raisonnable est défini sur le nouveau fichier.

Précautions de sécurité

La plupart d'entre nous ne laisserons pas un total de fichiers aléatoires de stockage d'étranger sur notre PC, mais lorsque vous autorisez les fichiers à télécharger dans notre application, vous le faites réellement. Vous prévoyez peut-être que l'utilisateur télécharge ses propres photos comme une page de profil, mais que se passe-t-il s'il essaie de télécharger un fichier exécutable contenant du virus spécialement conçu? Je souhaite partager certaines étapes que vous pouvez prendre pour minimiser les risques de sécurité inhérents à l'autoriser les téléchargements de fichiers. L'une des étapes consiste à vérifier que le fichier téléchargé est correct. Dépenser la valeur de $_FILES["myFile"]["type"] ou l'extension du nom du fichier n'est pas sûre, car les deux sont sujets à la contrefaçon. Au lieu de cela, utilisez une fonction comme exif_imagetype() pour vérifier le contenu du fichier et déterminer s'il s'agit bien de GIF, JPEG ou de plusieurs autres formats d'image pris en charge. Si exif_imagetype() n'est pas disponible (la fonction nécessite que l'extension EXIF ​​soit activée), alors getimagesize() peut être utilisé. getimagesize() Le tableau renvoyé contiendra le type d'image (s'il est reconnu).

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Pour les fichiers non d'image, vous pouvez utiliser exec() pour appeler l'utilitaire de fichier UNIX. Le fichier détermine le type de fichier en recherchant des signatures binaires connues à l'emplacement attendu.

<code>file_uploads = On</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion
Copier après la connexion

Une autre étape que vous pouvez prendre consiste à imposer une limite stricte à la taille totale de la demande de poste et au nombre de fichiers pouvant être téléchargés. Pour ce faire, spécifiez des valeurs appropriées pour les directives upload_max_size, post_max_size et max_file_uploads dans php.ini. La directive upload_max_size spécifie la taille maximale pour les téléchargements de fichiers. En plus de la taille téléchargée, vous pouvez également utiliser la directive Post_max_Size pour limiter la taille de toute la demande de poste. Max_file_uploads est une directive plus récente (ajoutée dans la version 5.2.12) qui limite le nombre de téléchargements de fichiers. Ces trois instructions aident à protéger votre site Web contre les attaques qui tentent de saper sa disponibilité en provoquant beaucoup de trafic réseau ou de charge système.

<code>upload_tmp_dir = "/tmp"

tboronczyk@zarkov:~$ ls -l / | grep tmp
drwxrwxrwt  13 root root 40960 2011-08-31 00:50 tmp</code>
Copier après la connexion
Copier après la connexion
Copier après la connexion

La troisième étape que vous pouvez franchir est d'utiliser le scanner de virus pour scanner les fichiers téléchargés. Ceci est crucial à l'ère d'aujourd'hui de virus et de logiciels malveillants généralisés, en particulier lorsque votre site Web permet à d'autres personnes de télécharger des fichiers téléchargés plus tard, tels que les pièces jointes dans des clients de messagerie Web ou des sites de partage de fichiers (légaux). Il existe une extension PHP qui peut accéder à Clamav, mais, bien sûr, vous pouvez appeler l'utilitaire de ligne de commande de Clamav comme je l'ai démontré pour le fichier.

Copier après la connexion
Copier après la connexion

Résumé

Vous avez appris à quel point il est facile d'utiliser votre site Web ou votre application Web pour prendre en charge les téléchargements de fichiers. Pour que le téléchargement réussisse, le formulaire HTML doit être soumis via une demande de poste multiparte / formulaire en codation et PHP doit permettre des transferts spécifiés à l'aide de la directive File_uploads. Une fois le fichier transféré, le script responsable de la gestion du téléchargement déplace le fichier du répertoire temporaire à l'emplacement souhaité à l'aide des informations trouvées dans le tableau $_FILES. Je partage également quelques précautions supplémentaires que vous pouvez prendre pour protéger vous-même et vos utilisateurs de certains des risques associés à l'autorisation des téléchargements de fichiers. Vous voyez comment vous assurer que les noms de fichiers sont sécurisés, vérifier les types de fichiers, imposer des restrictions strictes au trafic de téléchargement et rechercher des virus.

(Un tel contenu, tel que la section FAQ, peut être ajouté au besoin)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal