Il faut tout d'abord définir le formulaire HTML qui
permettra de sélectionner le fichier à uploader sur le
serveur FTP.
Voici un exemple de formulaire :
Il reste plus qu'à définir le code de la page
uploadftp.php qui permettra d'obtenir une connexion
au serveur FTP grâce aux fonctions
FTP,
après soumission du formulaire.
À la soumission, le fichier sera envoyé par le navigateur
via le protocole HTTP et enregistré par le serveur dans un
dossier temporaire (paramétrable dans le fichier de
configuration php.ini).
Il existe des types de fichiers qui sont normalement interprétés par le navigateur comme étant spécifiques à une application. La dite application va s'exécuter et ouvrir le fichier.
On souhaite ne pas ouvrir cette application et forcer l'enregistrement du fichier sur le disque du client. Pour forcer l'apparition de la boîte de dialogue "Enregistrer...", il faut envoyer les entêtes HTTP adéquats au navigateur.
Il existe dans le fichier de configuration php.ini trois directives qui limitent la taille des fichiers que le serveur est capable de charger depuis le client :
upload_max_filesize fixe la taille maximum des fichiers chargés par les méthodes POST et PUT
post_max_size (supérieur à upload_max_filesize) fixe la taille maximum des fichiers chargés par la méthode POST
memory_limit (supérieur à post_max_size) fixe la taille de la mémoire du script
qui s'expriment en octets.
De plus, côté client, le formulaire HTML peut contenir le champ caché (input type=hidden) suivant : MAX_FILE_SIZE qui s'exprime lui aussi en octets. Ce dernier interdit au navigateur d'envoyer au serveur un fichier plus gros que MAX_FILE_SIZE octets.
Il existe enfin la directive max_input_time qui définit le temps maximal, en secondes, au script pour recevoir les données ; cela inclut le téléchargement du fichier. Pour de multiples fichiers, ou de gros fichiers, ou pour les utilisateurs sur de faibles connexions, la valeur par défaut de 60 secondes peut être dépassée.
Dans le cas où vous n'avez pas accès au php.ini, optez pour une connexion FTP...
Imaginons que vous créez un espace membre dont l'accès est sécurisé par login et mot de passe, et que vous proposiez à vos visteurs inscrits de télécharger des documents, par exemple :
http://www.monsite.fr/docs/unfichier.pdf
Il suffit que cette URL soit diffusée sur le Net pour que n'importe qui accède à votre fichier sans avoir à s'identifier. Une solution serait d'utiliser des fichiers de directives de configuration du serveur Apache : .htaccess et .htpasswd, mais vous vous retrouveriez avec deux systèmes d'authentification !
La solution passe par le stockage des chemins réels de vos fichiers dans une base de données et de passer un identifiant numérique à un script de téléchargement afin que celui-ci récupère le contenu du fichier en question.
Par exemple, l'URL devient :
http://www.monsite.fr/download.php?id=31
Le script download.php va chercher le chemin du fichier correspondant :
Il n'est pas possible pour des raisons évidentes de sécurité de faire ce genre d'opération. PHP s'exécute côté serveur et rien ne peut être tenté côte client sans son accord.
Autrement dit, il n'est pas possible de mettre une valeur par défaut dans un champ HTML de type FILE.
Après avoir pressé sur le bouton "submit", le fichier est envoyé par le navigateur via le protocole HTTP et enregistré par le serveur dans le dossier des éléments temporaires (paramétrable dans le fichier de configuration php.ini).
Et maintenant le script PHP qui récupère le fichier pour le stockage dans le répertoire voulu.
N'oubliez pas de vérifier les droits d'écriture sur le répertoire où on a stocké le fichier.
Attention également à la fonction move_uploaded_file : si le fichier de destination existe déjà, il sera écrasé
Le client ne peut pas sélectionner plusieurs fichiers dans la boîte de dialogue du navigateur. Pour cela, on utilise une astuce : plusieurs champs <INPUT FILE> :