PHP-Klasse zum Herunterladen und Hochladen von Dateien auf den Server

Vorwort


Ich habe vorher nicht darüber nachgedacht und eine fertige Lösung wie Drupal zum Hochladen von Dateien verwendet, und ich brauchte nicht mehr. Bis vor ein paar Monaten musste ich dringend nicht nur Akten geben.

Im Internet finden Sie zahlreiche Informationen zum Herunterladen von Dateien von einem Server und zum Hochladen von Dateien auf einen Server sowie zwischen Servern. Aber nirgendwo gibt es eine einfache Lösung, die mehr oder weniger universell wäre.


Ich habe mehrere Tage getötet, um alle Arten von Überschriften und Variationen der Verwendung von cUrl zu lernen, aber alles zusammenzusetzen hat nicht funktioniert. Ich habe viele verschiedene ähnliche Klassen gesehen, aber überall gab es entweder eine Teillösung oder eine sehr verwirrende oder beides.


Und nur dank einzelner Artikel, Informationen aus den Foren und allerlei Kommentaren ist es uns gelungen, das Puzzle zusammenzustellen. Ich behaupte nicht, dass meine Lösung vollständig universell ist, aber in vielen Fällen sehr praktisch, obwohl es an Ihnen liegt.


Wenn jemand den Wunsch hat, meine Lösung für dieses Problem zu verbessern, und Kenntnisse in dieser Richtung fehlen, bin ich froh, wenn Sie Korrekturen oder Ergänzungen an dem Code vornehmen, der auf GitHub öffentlich verfügbar ist.


Und nun zu den Funktionen der CargaDes-Klasse:


  1. Datei-Upload über den Browser ohne Angabe des Speicherorts und mit der Möglichkeit der Wiederaufnahme;
  2. Hochladen einer Datei auf den Server über einen Browser mit einer Fortschrittsanzeige;
  3. Herunterladen von Dateien von einem Remote-Server auf Ihren Server mit einer Fortschrittsanzeige;
  4. Laden Sie Dateien von Ihrem Server auf einen Remote-Server mit einer Fortschrittsanzeige hoch.

Zuerst müssen Sie die CargaDes-Klasse herunterladen und verbinden:


1. Hochladen von Dateien über den Browser ohne Anzeige des Speicherorts mit der Möglichkeit, die Steuerung fortzusetzen und zu beschleunigen


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

Diese Methode ist Drupal und seiner Art sehr ähnlich:


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

Ich habe mehr Kickback mit Apache hinzugefügt, aber die XSendFile On-Direktive sollte aktiviert sein


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

Unmittelbar nach dem Ausführen der Methode zeigt der Browser ein Fenster zum Speichern der Datei an


2. Hochladen von Dateien auf den Server über einen Browser mit Fortschrittsanzeige


 $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(); 

Nach der Ausführung der Methode werden eine Schaltfläche zum Auswählen von Dateien und eine Schaltfläche zum Herunterladen von Dateien angezeigt. Für jede ausgewählte Datei wird eine Anzeige angezeigt.



3. Herunterladen von Dateien von einem Remote-Server auf Ihren Server


 $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. Wir geben die Datei von unserem Server an den Remote-Server weiter


 $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'];} 

Als Ergebnis möchte ich sagen


Wenn dieser Kurs mindestens einer Person hilft, werde ich mich sehr darüber freuen. Wie eingangs gesagt, freue ich mich über konstruktive Kritik und Ergänzungen, die zur Verbesserung der Klasse führen können. Link zu CargaDes.class .




Die Methoden zur Verwendung der Klasse im Artikel wurden geändert. Und er fügte eine Beschreibung dessen hinzu, was sich in der Klasse geändert hat.


Damit ist die Arbeit an den Fehlern beendet, wenn ich es so nennen darf.


Was wurde getan:


  1. Er hat den Code mit PHPSTORM auf einen Stil gebracht und versucht, PSR zu erfüllen.
  2. Unterstriche in Funktionsnamen entfernt;
  3. Vollständig ausgeschlossene jQuery;
  4. Alle statischen Methoden wurden entfernt.
  5. Hat eine Klasse als Komponistenpaket erstellt.
  6. cUrl hat in einer separaten Methode ein Fußtuch hergestellt;
  7. Ich habe versucht, SRP einzuhalten.
  8. Ausnahmen gemacht und die Fehlerausgabe leicht verändert;
  9. Der Körper der Konstrukteure wurde korrigiert.
  10. Versucht, wenn-sonst Konstruktionen zu verbessern;
  11. Hat js und html außerhalb der Klasse rausgenommen;
  12. Entfernte das schließende Tag?>;
  13. Möglichkeit zum Übersetzen von Nachrichten hinzugefügt;
  14. Ordner mit ausführbaren Beispielen hinzugefügt.

Was wurde nicht gemacht:


  1. Übersetzung von Kommentaren ins Englische (wenn all dies für niemanden notwendig ist, warum dann Zeit verschwenden);
  2. Ich habe die Namen der Funktionen nicht in verständlichere Namen geändert (es ist mir nicht klar, welche, wenn englisch, Punkt N1 ansehen).
  3. Ich habe Autotests gesehen, aber es ist sehr gut. schwierig, da universell zu tun Jedes hat seine eigenen Handlungsszenarien, obwohl ich mich vielleicht irre. Wenn Sie es in einer Klasse für notwendig halten, die niemand braucht, haben Sie die Möglichkeit, mir dabei zu helfen.
  4. Noch etwas ist möglich, aber ich weiß noch nicht, was Sie so für eine Gelegenheit haben, mir davon zu erzählen.

Im Allgemeinen habe ich versucht, es zu beheben, was in den Kommentaren gesagt wurde, wenn andere Mängel oder Fehler gefunden werden - schreibe, ich werde versuchen, es zu beheben.


Vielen Dank für die konstruktive Kritik an webdevium und alutskevich , wenn ich könnte, dann würde ich Sie auf jeden Fall unterstützen.


Ich danke auch allen anderen da Ich hatte Verständnis für meinen Hauptfehler und ein paar Ideen waren geboren.

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


All Articles