789 Shares 9722 views

PHP: téléchargement de fichiers sur le serveur

Le téléchargement de fichiers via PHP – un cas très intéressant, auquel doit être abordée avec beaucoup d'attention. Sur Internet, vous pouvez trouver de nombreux exemples de la mise en œuvre du transfert de fichiers, mais pas tous d'entre eux sont bons et se conformer aux règlements de sécurité.

De telles choses doivent amener à une conclusion, même si elle prend beaucoup de temps. Si vous laissez un espace dans le code, votre serveur entier peut être compromise.

sécurité

Avec PHP télécharger le fichier sur le serveur se fait assez facilement. Le code est très court et simple. Juste quelques lignes. Cependant, cette méthode est dangereuse. Beaucoup plus de temps et de lignes de code loin à la sécurité.

Le danger est que, si vous ne faites pas les inspections, tout attaquant pourrait télécharger leurs scripts sur votre serveur. Dans ce cas, il aura un accès complet. Il peut faire ce qu'il veut:

  • supprimer la base de données;
  • supprimer des sites de fichiers;
  • modifier les sites de fichiers;
  • ajouter votre annonce à votre site Web;
  • télécharger des virus;
  • rediriger tous les utilisateurs sur leurs sites;
  • et bien d'autres choses qui viennent à l'esprit attaquant.

Vous devriez toujours vérifier que tente de télécharger un fichier pour l'utilisateur. Par exemple, si vous téléchargez des images seulement, il est nécessaire de vérifier que le fichier est une image avec précision. Sinon, vous téléchargerez quoi que ce soit.

Exactement comment mettre en œuvre la vérification, il sera affiché, avec le script d'examen direct pour télécharger des fichiers.

Création d'un formulaire PHP

formulaire de téléchargement de fichiers est très simple. Manquant les boutons bouton de navigation et téléchargement.

Décrit comment créer des formulaires ne seront pas, car il est facile. D'autres instructions supposent que vous avez déjà les concepts de base de HTML (sinon vous ne seriez pas la recherche d'informations sur le téléchargement sur PHP).

Mais notez que les données sous la forme que vous devez ajouter l'attribut enctype.

Dans le cas contraire, les données sur gestionnaire de fichiers ne seront pas transmises.

Comment ça devrait fonctionner?

Lorsque vous cliquez sur le bouton Parcourir, vous devriez voir une boîte où a demandé de choisir un fichier.

Après cela, il sera nécessaire de recevoir un chemin où se trouve le fichier.

Si le chemin ne semble pas, effectuer l'action à nouveau.

Après avoir cliqué sur le gestionnaire de fichiers de téléchargement peut donner toute information.

Par exemple, vous pouvez écrire la ligne qui indique que le fichier est « untel » le nom a été transféré avec succès dans le dossier « tel ou tel ». Bien sûr, le nom du fichier sera donné toujours différent.

En règle générale, cette information est utilisée pour le code de débogage. Ainsi, il est possible de vérifier que les données sont transmises et se produisent dans le écrit répertoire désiré. Cela est, même le nom du fichier est indiqué. Étant donné que ces informations supplémentaires que l'utilisateur n'a pas besoin.

Il est logique de sortie le nom que si l'utilisateur télécharge plusieurs fichiers. Tel est le cas, envisager un peu plus loin. Mettons-nous pas en avance sur nous-mêmes.

réglage

Dans le fichier PHP télécharger sur le serveur nécessite certains paramètres, ce qui devrait être fait dans le fichier php.ini. Ce fichier contient un grand nombre de paramètres. Tous nous ne avons pas besoin. Nous sommes intéressés par trois lignes: file_uploads, upload_tmp_dir et upload_max_filesize.

S'il vous plaît noter que ces paramètres auront une incidence sur tous vos sites sur le serveur, pas seulement une. Par conséquent, pour définir la taille maximale en fonction du fait que vous devrez charger les utilisateurs. Il est recommandé de ne pas mettre trop grand.

Une fois que vous modifiez les valeurs de ces paramètres, vous devez redémarrer le serveur. Sinon, les paramètres ne prendront effet, comme ils ont lu au moment de la charge du serveur.

Vous pouvez le faire dans la console en se connectant via SSH au serveur. Entrez simplement le service de commande httpd restart, puis les paramètres prennent effet.

Une autre méthode – un redémarrage par ISP panneau ou via le fournisseur de panneaux de facturation.

fichier Array

Dans le fichier PHP téléchargement se fait par le tableau $ _FILES. Il contient toutes les informations sur les fichiers que nous téléchargeons.

Pour voir les informations contenues dans le tableau, assez pour écrire dans le gestionnaire de fichiers suivant.

Sélectionnez un fichier et cliquez sur « Envoyer ». Sur la page de gestionnaire affichera les informations qui sont stockées dans $ _FILES. La variable est entièrement écrit avec des lettres majuscules. PHP – un langage sensible.

Comme vous pouvez le voir, ce tableau a beaucoup de domaines. Tous sont importants pour nous. Le premier champ contient le nom du fichier sous la forme dans laquelle il est utilisé sur votre ordinateur.

Le type de fichier spécifié colonne de type. Tmp_name champ correspond au nom du fichier temporaire. Après la fin du script sera supprimé.

Le champ d'erreur contient un code d'erreur. Ce fut un peu plus loin. Taille – la taille en octets.

erreurs

Effectué par le téléchargement de fichiers PHP est toujours accompagné d'un code d'erreur. Un message d'erreur est entré dans la « erreur ». L'erreur de capture d'écran est égal à zéro.

Tenez compte de la valeur de toutes les erreurs:

Il a été dit ci-dessus sur le paramètre qui peut être spécifié dans le code HTML habituelle.

Voici un exemple de formulaire pour télécharger le fichier, ce qui indique une limite du montant du fichier téléchargé.

PHP: fichier script d'upload

Comme toutes les mises en pratique? Dans le téléchargement de fichiers PHP se produit commande de copie. Si vous êtes intéressé par la question de savoir comment télécharger un fichier, la réponse est simple, d'auteur, qui utilise deux paramètres – le fichier source et le fichier de destination.

Mais, comme indiqué plus haut, il ne peut pas être limitée pour des raisons de sécurité. Par exemple, vérifier quel type de fichier que nous expédions, vous pouvez utiliser le type de champ dans le tableau $ _FILES. Tout d'abord, nous allons traiter avec l'inspection, puis passer au script complet

Disons que vous voulez permettre aux utilisateurs de télécharger une photo avec une résolution de seulement GIF, JPEG ou PNG. Indiquez peut être comme ça.

if ($ _ FILES [ 'file_upload'] [ 'type']! = "image / gif") {
echo "Désolé, nous ne supportons le téléchargement de Gif-Files";
sortie;
}

Si vous voulez expédier tous les 3 types, il suffit d'ajouter une condition supplémentaire à l'autre type d'image.

La copie se fait comme suit: copie (image 1, image 2).

Dans notre cas, lorsque le travail est en cours de téléchargement à partir du PC au serveur, vous pouvez le faire

copie ($ _ FILES [ 'file_upload'] [ "tmp_name"], "1.jpg")

Autrement dit, le fichier sera copié avec le nom 1.jpg. Ce n'est pas tout à fait correct. Dans ce cas, il est seulement un exemple. Le nom du fichier est toujours nécessaire de spécifier différents, et spécifiez l'extension, en fonction du fichier.

Déterminer l'extension peut être différentes façons. Tout dépend du développeur de l'érudition. L'un des moyens les plus rapides (une différence de quelques dixièmes de secondes) déterminer l'extension – c'est le code suivant.

$ Path_info = pathinfo ($ _ FILES [ 'photo1'] [ "nom"]);

$ Ext = $ path_info [ 'extension'];

La variable $ la poste nous stockerons l'extension souhaitée. Un nom de fichier peut être défini au hasard en utilisant md5. Si vous prévoyez de télécharger un grand nombre de fichiers, il est préférable de les expédier à des dossiers différents. Il sera donc plus pratique. En particulier, si vous voulez purger.

pour télécharger le code sera le suivant.

/// Avec photo

si ($ _FILES [ 'photo1'] [ 'tmp_name'] == null)

{

echo ( « fichier Unknown

.

Retour …

« );

sortie;

}

///. Vous dites que pour tout projet sur le serveur est autorisé à charger des fichiers volumineux (vidéo), mais il y a des photos que, et les utilisateurs doivent limiter

if (($ _FILES [ "photo1"] [ "taille"]> 1024 * 1024 * 2)

{

?>

la taille maximale autorisée de 2 MB

Retour …

<?

sortie;

}

// créer des dossiers

// créer un dossier du mois en cours

if (! file_exists ( "img /". Date ( "M")))

{

mkdir ( "img /" Date ( "M").);

}

// créer un dossier de la journée en cours

if (! file_exists ( "img /" date. ( "M"). "/" date. ( "d")))

{

mkdir ( "img /" Date (date "M") "/" ( "d") …);

}

/// extension de fichier

$ Path_info = pathinfo ($ _ FILES [ 'photo1'] [ "nom"]);

$ Ext = $ path_info [ 'extension'];

/// générer le nom de fichier

$ Id = md5 (date ( "AMJ"));

si (copie ($ _ FILES [ 'photo1'] [ "tmp_name"], "img /". Date ( "M"). "/". Date ( "d"). "/". $ id. ext $) )

{

echo ( "Fichier téléchargé avec succès");

}

/// toute action ultérieure (entrée dans la base de données, et ainsi de suite. N.)

}

plusieurs fichiers

Télécharger plusieurs fichiers simultanément (PHP) se produit au moyen de champs supplémentaires sous la forme.

Cette méthode est pas très bon, car il limite le nombre de fichiers à télécharger. De plus, il est considéré comme une mauvaise forme dans la programmation. Essayez de faire tout dynamique.

L'option idéale – c'est un choix d'un grand nombre de fichiers à la fois en appuyant sur un seul bouton.

Pour ce faire, créez une forme comme ce code.

Notez que le multiple ajout du mot, et le nom est donné comme un tableau []. Dans ce cas, tableau $ _FILES sera légèrement différente. Vous obtiendrez un tableau du tableau.

Pour tester peut à nouveau utiliser le var_dump ($ _ FILES);

Tous vos fichiers seront placés dans le tableau comme celui-ci:

  1. $ _FILES [ "fichier1"] [ "nom"] [0]
  2. $ _FILES [ "fichier1"] [ "nom"] [1]
  3. Et ainsi de suite.

Entre parenthèses est écrit le numéro de fichier dans le tableau. A compter de zéro. Nous les traitons de la même façon, il suffit de demander le cycle et en communiquant avec le code ci-dessus décrit à la fin de l'indice en ajoutant [$ i].

$ I = 0;

while ($ _FILES [ "fichier1"] [ "nom"] [$ i] '')

{

/// coller le code ci-dessus

}

Ainsi, vous devrez passer par un téléchargement de fichier PHP sur le serveur dans un cycle sans répétition inutile du code, comme cela est généralement le cas si vous utilisez la version avec un nombre statique de fichiers (dernière photo).