Classe PHP para baixar e fazer upload de arquivos para o servidor

Prefácio


Eu não pensei nisso antes e usei uma solução pronta como o Drupal para fazer upload de arquivos e não precisava de mais. Até alguns meses atrás, eu tinha uma necessidade urgente não apenas de fornecer arquivos.

Há muitas informações na Internet sobre como baixar arquivos de um servidor e fazer upload de arquivos para um servidor, bem como entre servidores. Mas em nenhum lugar existe uma solução simples que seria mais ou menos universal.


Eu matei vários dias para aprender todos os tipos de cabeçalhos e variações do uso de cUrl, mas juntar tudo não funcionou. Eu vi muitas classes semelhantes diferentes, mas em todos os lugares havia uma solução parcial, ou muito confusa, ou ambas.


E somente graças a artigos únicos, informações dos fóruns e todo tipo de comentários, conseguimos montar o quebra-cabeça. Não afirmo que minha solução seja completamente universal, mas muito conveniente em muitos casos, embora seja com você.


Se alguém desejar melhorar minha solução para esse problema e não possuir conhecimento nessa direção, ficarei feliz em fazer alguma correção ou acréscimo ao código que está disponível publicamente no GitHub .


E agora, ao ponto, as funções da classe CargaDes:


  1. Upload de arquivos via navegador sem mostrar seu local de armazenamento e com a possibilidade de retomar;
  2. Upload de um arquivo para o servidor através de um navegador com um indicador de progresso;
  3. Download de arquivos de um servidor remoto para seu servidor com um indicador de progresso;
  4. Carregue arquivos do seu servidor para um servidor remoto com um indicador de progresso.

Primeiro, você precisa baixar e conectar a classe CargaDes:


1. Upload de arquivos via navegador sem mostrar seu local de armazenamento com a capacidade de retomar e acelerar o controle


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

Este método é muito semelhante ao Drupal e seus tipos:


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

Adicionei mais propinas com o Apache, mas a diretiva XSendFile On deve estar ativada


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

Imediatamente após a execução do método, o navegador exibirá uma janela para salvar o arquivo


2. Carregar arquivo / s para o servidor via navegador com indicador de progresso


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

Após a execução do método, um botão para selecionar arquivos e um botão para baixar arquivos serão exibidos. Um indicador será exibido para cada arquivo selecionado individualmente.



3. Baixando arquivos de um servidor remoto para o seu 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. Nós entregamos o arquivo para o servidor remoto do nosso 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, eu quero dizer


Se esta aula ajudar pelo menos uma pessoa, ficarei muito feliz com isso. Como eu disse no começo, terei prazer em críticas construtivas e acréscimos que podem levar à melhoria da classe. Link para CargaDes.class .




Foram alterados os métodos de uso da classe no artigo. E ele adicionou uma descrição do que mudou na classe.


Isso terminou o trabalho sobre os erros, se assim posso chamar.


O que foi feito:


  1. Ele trouxe o código para um estilo usando o PHPSTORM e tentou cumprir o PSR;
  2. Sublinhados removidos dos nomes das funções;
  3. JQuery completamente excluído;
  4. Removido todos os métodos estáticos;
  5. Fez uma aula como um pacote de compositor;
  6. cUrl fez um calçado em um método separado;
  7. Eu tentei cumprir o SRP;
  8. Fez exceções e alterou ligeiramente a saída de erro;
  9. Corrigido o corpo dos construtores;
  10. Tentou melhorar construções if-else;
  11. Tirou js e html fora da classe;
  12. Removida a tag de fechamento?>;
  13. Adicionada a capacidade de traduzir mensagens;
  14. Adicionada uma pasta com exemplos executáveis.

O que não foi feito:


  1. Tradução de comentários para o inglês (se tudo isso não é necessário para ninguém, por que perder tempo);
  2. Não mudei os nomes das funções para outras mais compreensíveis (não está claro para mim qual, se em inglês, olha para o ponto N1);
  3. Eu assisti a autotestes, mas é muito bom. difícil de fazer universalmente desde cada um tem seus próprios cenários de ação, embora talvez eu esteja errado, se você considera necessário em uma classe que ninguém precisa, você tem a oportunidade de me ajudar com isso;
  4. Outra coisa é possível, mas eu ainda não sei o que você tem a oportunidade de me dizer sobre isso.

Em geral, tentei consertá-lo, como foi dito nos comentários, se forem encontradas outras falhas ou erros - escreva, tentarei consertá-lo.


Obrigado pelas críticas construtivas do webdevium e do alutskevich , se eu pudesse, definitivamente gostaria de mais você.


Também agradeço a todos porque Eu entendi meu erro principal e algumas idéias nasceram.

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


All Articles