Clase PHP para descargar y cargar archivos al servidor

Prólogo


No pensé en esto antes y usé una solución lista para usar como Drupal para cargar archivos, y no necesitaba más. Hasta hace unos meses tenía una necesidad urgente no solo de entregar archivos.

Hay mucha información en Internet sobre cómo descargar archivos de un servidor y cargar archivos en un servidor, así como entre servidores. Pero en ninguna parte hay una solución simple que sería más o menos universal.


Maté varios días para aprender todo tipo de encabezados y variaciones del uso de cUrl, pero poner todo junto no funcionó. Vi muchas clases similares diferentes, pero en todas partes había una solución parcial, o muy confusa, o ambas.


Y solo gracias a artículos individuales, piezas de información de los foros y todo tipo de comentarios, logramos armar el rompecabezas. No pretendo que mi solución sea completamente universal, pero muy conveniente en muchos casos, aunque depende de usted.


Si alguien desea mejorar mi solución a este problema y carece de conocimiento en esta dirección, me alegrará si realiza alguna corrección o adición al código que está disponible públicamente en GitHub .


Y ahora al grano, las funciones de la clase CargaDes:


  1. Carga de archivos a través del navegador sin mostrar su ubicación de almacenamiento y con la posibilidad de reanudar;
  2. Subir un archivo al servidor a través de un navegador con un indicador de progreso;
  3. Descargar archivos de un servidor remoto a su servidor con un indicador de progreso;
  4. Cargue archivos de su servidor a un servidor remoto con un indicador de progreso.

Primero necesita descargar y conectar la clase CargaDes:


1. Carga de archivos a través del navegador sin mostrar su ubicación de almacenamiento con la capacidad de reanudar y controlar la velocidad


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

Este método es muy similar a Drupal y su tipo:


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

Agregué más sobornos con Apache, pero la directiva XSendFile On debería estar habilitada


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

Inmediatamente después de ejecutar el método, el navegador mostrará una ventana para guardar el archivo


2. Cargue los archivos al servidor a través del navegador con indicador de progreso


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

Después de ejecutar el método, aparecerá un botón para seleccionar archivos y un botón para descargar archivos. Aparecerá un indicador para cada archivo seleccionado individualmente.



3. Descargar archivos de un servidor remoto a su servidor


 $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. Entregamos el archivo al servidor remoto desde nuestro servidor


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

Como resultado, quiero decir


Si esta clase ayuda al menos a una persona, estaré muy feliz al respecto. Como dije al principio, estaré contento con las críticas constructivas y las adiciones que pueden conducir a la mejora de la clase. Enlace a CargaDes.class .




Cambió los métodos de uso de la clase en el artículo. Y agregó una descripción de lo que ha cambiado en la clase.


Eso terminó de trabajar en los errores, si puedo llamarlo así.


Lo que se ha hecho:


  1. Él llevó el código a un estilo usando PHPSTORM e intentó cumplir con PSR;
  2. Se eliminaron los guiones bajos de los nombres de funciones;
  3. Completamente excluido jQuery;
  4. Se eliminaron todos los métodos estáticos;
  5. Hizo una clase como un paquete de compositor;
  6. cUrl hizo una tela para los pies en un método separado;
  7. Traté de cumplir con SRP;
  8. Hizo excepciones y cambió ligeramente la salida de error;
  9. Corregido el cuerpo de los constructores;
  10. Intenté mejorar las construcciones if-else;
  11. Sacó js y html fuera de la clase;
  12. Se eliminó la etiqueta de cierre?>;
  13. Se agregó la capacidad de traducir mensajes;
  14. Se agregó una carpeta con ejemplos ejecutables.

Lo que no se ha hecho:


  1. Traducción de comentarios al inglés (si todo esto no es necesario para nadie, entonces por qué perder el tiempo);
  2. No cambié los nombres de las funciones por otras más comprensibles (no me queda claro cuál, si es inglés, mira el punto N1);
  3. Vi las pruebas automáticas, pero es muy bueno. difícil de hacer universalmente desde cada uno tiene sus propios escenarios de acciones, aunque tal vez me equivoque, entonces si lo considera necesario en una clase que nadie necesita, tiene la oportunidad de ayudarme con esto;
  4. Algo más es posible, pero aún no sé qué es lo que tiene la oportunidad de contarme al respecto.

En general, intenté solucionarlo, lo que se dijo en los comentarios, si se encuentran otras deficiencias o errores, escriba, intentaré solucionarlo.


Gracias por la crítica constructiva de webdevium y alutskevich , si pudiera, definitivamente definitivamente te agradecería.


También agradezco a todos los demás porque Comprendí mi error principal y nacieron un par de ideas.

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


All Articles