Classe PHP pour télécharger et télécharger des fichiers sur le serveur

Préface


Je n'y avais pas pensé avant et j'ai utilisé une solution prête à l'emploi comme Drupal pour télécharger des fichiers, et je n'en avais pas besoin de plus. Jusqu'à il y a quelques mois, j'avais un besoin urgent non seulement de donner des fichiers.

Il existe de nombreuses informations sur Internet sur la façon de télécharger des fichiers à partir d'un serveur et de télécharger des fichiers sur un serveur, ainsi qu'entre les serveurs. Mais nulle part il n'y a de solution simple qui serait plus ou moins universelle.


J'ai tué plusieurs jours pour apprendre toutes sortes d'en-têtes et de variantes d'utilisation de cUrl, mais tout assembler n'a pas fonctionné. J'ai vu beaucoup de classes similaires différentes, mais partout il y avait soit une solution partielle, soit très déroutante, soit les deux.


Et seulement grâce à des articles uniques, des informations provenant des forums et toutes sortes de commentaires, nous avons réussi à assembler le puzzle. Je ne prétends pas que ma solution est complètement universelle, mais très pratique dans de nombreux cas, même si cela dépend de vous.


Si quelqu'un souhaite améliorer ma solution à ce problème et manque de connaissances dans ce sens, je serai heureux si vous apportez des corrections ou des ajouts au code qui est publiquement disponible sur GitHub .


Et maintenant au point, les fonctions de la classe CargaDes:


  1. Téléchargement de fichiers via un navigateur sans afficher son emplacement de stockage et avec la possibilité de reprendre;
  2. Téléchargement d'un fichier sur le serveur via un navigateur avec un indicateur de progression;
  3. Téléchargement de fichiers d'un serveur distant vers votre serveur avec un indicateur de progression;
  4. Téléchargez des fichiers de votre serveur vers un serveur distant avec un indicateur de progression.

Vous devez d'abord télécharger et connecter la classe CargaDes:


1. Téléchargement de fichiers via un navigateur sans afficher son emplacement de stockage avec la possibilité de reprendre et de contrôler la vitesse


$realFilePath = dirname( __FILE__ ) . '/file.zip';//     

Cette méthode est très similaire à Drupal et ses semblables:


 $CargaDes = new CargaDes; $client_d = new ClientD($realFilePath); //   $client_d->erroff = false;//True    $client_d->lang = 'ru'; $client_d->speed = 25;//     kB,  0   ; 

J'ai ajouté plus de recul avec Apache, mais la directive XSendFile On devrait être activée


 $client_d->apache = false;//True    Apache(           ) //  $CargaDes->setOnStart(new Exe($client_d)); echo $CargaDes->Start(); 

Immédiatement après l'exécution de la méthode, le navigateur affichera une fenêtre pour enregistrer le fichier


2. Téléchargez le ou les fichiers sur le serveur via un navigateur avec indicateur de progression


 $url_server = "http://_.com/upload.php";//     . $multiple = 0;//True   , False     $CargaDes = new CargaDes; $client_u = new ClientU($url_server, $multiple); //   $client_u->param = 0;//       param -   param=>array( ) $client_u->ajaxParam = '';//    - data.append("key", "val"); $client_u->returns = '';//    ajax $client_u->err_file_zero;//     $client_u->allowed_ext = 'gif,jpg,png,jpe,jpeg,zip,rar,exe,doc,pdf,swf,flv,avi,mp4,mp3';//   $client_u->err_file_ext;//       $client_u->max_file_size = 0;//      ,    $client_u->err_file_size;//       $client_u->max_file_count = 0;//    ,    $client_u->btn_input;//    $client_u->btn_enviar;//    $client_u->btn_del;//      $client_u->color;//    $client_u->css;//    $server->lang = 'ru'; //   $CargaDes->setOnStart(new Exe($client_u, 'p' )); echo $CargaDes->Start(); 

Une fois la méthode exécutée, un bouton de sélection de fichiers et un bouton de téléchargement de fichiers apparaissent. Un indicateur apparaîtra pour chaque fichier sélectionné individuellement.



3. Téléchargement de fichiers d'un serveur distant sur votre serveur


 $CargaDes = new CargaDes; $server = new Server(); //  $CargaDes->setOnStart(new Exe($server, 'p')); echo $CargaDes->Start(); $server->remoteUrl = 'http://.com/test/file.zip'; $server->realFilePath = dirname( __FILE__ ) . '/file.zip'; //   $server->progress = 1;///  $server->speed = 0;//  $server->style;//  $server->color;//    $server->erroff = false;//   $server->debug = false;// $server->login = 0;//   ,     .htaccess $server->pass = 0;//   ,     .htaccess $server->lang = 'ru'; //  $CargaDes->setOnStart(new Exe($server, 's')); $r = $CargaDes->Start(); //  if( $r['test'] == false ) {echo $r['result'];} 

4. Nous remettons le fichier au serveur distant depuis notre serveur


 $CargaDes = new CargaDes; $server = new Server(); //  $CargaDes->setOnStart(new Exe($server, 'p')); echo $CargaDes->Start(); $server->remoteUrl = 'http://.com/test/priem.php'; $server->realFilePath = dirname( __FILE__ ) . file.zip;//    //   $server->post = array( 'login' => 'test', 'pass' => '12345' );//        $server->progress = 1;///  $server->speed = 0;//  $server->style;//  $server->color;//    $server->erroff = false;//   $server->debug = false;// $server->login = 0;//   ,     .htaccess $server->pass = 0;//   ,     .htaccess $server->lang = 'ru'; //  $CargaDes->setOnStart(new Exe($server, 'u')); $r = $CargaDes->Start(); //  if( $r['test'] == false ) {echo $r['result'];} 

En conséquence, je veux dire


Si ce cours aide au moins une personne, j'en serai très heureux. Comme je l'ai dit au début, je serai heureux des critiques constructives et des ajouts qui peuvent conduire à l'amélioration de la classe. Lien vers CargaDes.class .




Modification des méthodes d'utilisation de la classe dans l'article. Et il a ajouté une description de ce qui a changé dans la classe.


Cela a fini de travailler sur les erreurs, si je peux l'appeler ainsi.


Ce qui a été fait:


  1. Il a apporté le code à un style en utilisant PHPSTORM et a essayé de se conformer au PSR;
  2. Soulignés supprimés des noms de fonction;
  3. JQuery complètement exclu;
  4. Suppression de toutes les méthodes statiques;
  5. Créé une classe en tant que package compositeur;
  6. cUrl a fabriqué un couvre-pied selon une méthode distincte;
  7. J'ai essayé de me conformer à SRP;
  8. Fait des exceptions et légèrement modifié la sortie d'erreur;
  9. Correction du corps des constructeurs;
  10. A essayé d'améliorer les constructions if-else;
  11. A retiré js et html en dehors de la classe;
  12. Supprimé la balise de fermeture?>;
  13. Ajout de la possibilité de traduire des messages;
  14. Ajout d'un dossier avec des exemples exécutables.

Ce qui n'a pas été fait:


  1. Traduction des commentaires en anglais (si tout cela n'est nécessaire pour personne, alors pourquoi perdre du temps);
  2. Je n'ai pas changé les noms des fonctions en des fonctions plus compréhensibles (je ne sais pas trop qui, si l'anglais, regarde le point N1);
  3. J'ai regardé les autotests, mais c'est très bien. difficile à faire universellement depuis chacun a ses propres scénarios d'actions, bien que je me trompe peut-être, alors si vous le jugez nécessaire dans une classe dont personne n'a besoin, vous avez la possibilité de m'aider avec cela;
  4. Quelque chose d'autre est possible, mais je ne sais pas déjà ce que vous avez une telle opportunité de m'en parler.

En général, j'ai essayé de le réparer, ce qui a été dit dans les commentaires, si d'autres défauts ou erreurs sont détectés - écrivez, je vais essayer de le réparer.


Je vous remercie pour la critique constructive de webdevium et alutskevich , si je le pouvais, alors je serais certainement avec vous.


Je remercie également tout le monde parce que J'ai compris ma principale erreur et quelques idées sont nées.

Source: https://habr.com/ru/post/fr484492/


All Articles