Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Upload de mais de um aquivo por vez. Exemplo de TMultiFile Alguém tem algum exemplo de como usar o TMultiFile Preciso fazer upload de mais de um arquivo por vez... Muito obrigado...
MM
Upload de mais de um aquivo por vez. Exemplo de TMultiFile  
Alguém tem algum exemplo de como usar o TMultiFile

Preciso fazer upload de mais de um arquivo por vez...

Muito obrigado

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (15)


NR

Exemplo bem básico:
  1. <?php
  2. class MultifileForm extends TPage
  3. {
  4.     protected $form// form
  5.     
  6.     /**
  7.      * Class constructor
  8.      * Creates the page and the registration form
  9.      */
  10.     function __construct()
  11.     {
  12.         parent::__construct();
  13.         
  14.         $this->form = new TQuickForm('form_search_multifile');
  15.         $this->form->class 'tform';
  16.         $this->form->setFormTitle('Multifile');
  17.         
  18.         // create the form fields
  19.         $arquivos = new TMultiFile('arquivos');
  20.         // add the fields
  21.     $this->form->addQuickField('Arquivos'$arquivos);
  22.         
  23.         // create the form actions
  24.         $this->form->addQuickAction(_t('Save'), new TAction(array($this'onSave')), 'fa:floppy-o');
  25.         
  26.         // vertical box container
  27.         $container = new TVBox;
  28.         $container->style 'width: 90%';
  29.         $container->add($this->form);
  30.         
  31.         parent::add($container);
  32.     }
  33.     
  34.     function onSave()
  35.     {
  36.         try
  37.         {
  38.             TTransaction::open('permission');
  39.             
  40.             $data $this->form->getData();
  41.             
  42.             foreach ($data->arquivos as $arq)
  43.             {
  44.                 $source_file   'tmp/'.$arq;
  45.                 $target_file   'images/' $arq;
  46.                 
  47.                 if (file_exists($source_file))
  48.                 {
  49.                     rename($source_file,$target_file);
  50.                     
  51.                     $obj = new SeuModel();
  52.                     $obj->filename $target_file;
  53.                     $obj->store();
  54.                 }
  55.             }
  56.             
  57.             TTransaction::close();
  58.         }
  59.         catch(Exception $e)
  60.         {
  61.             new TMessage('error',$e->getMessage());
  62.             TTransaction::rollback();
  63.         }
  64.     }
  65. }
  66. ?>
MM

Muito obrigado
MM

Nataniel, boa noite

Fui testar o seu exemplo e no evento onSave o $this->form->getData() não está pegando a lista de arquivos.

Coloquei outros campos e retornam valor normalmente....
MM

Alguém já conseguiu usar a TMultFile?
NR

Marcus, o exemplo funcionou certinho aqui. Verifique se não está ocorrendo nenhum erro no upload do arquivo, como falta de permissão no diretório tmp por exemplo.
MM

Boa dica Nataniel.

Estou usando windows 2003r2 com IIS e PHP 7

Deve ser alguma configuração do usuário do IIS
MM

Realmente muito obrigado Nataniel, era permissão do usuário web.
CJ

Boa tarde,

Aproveitando esse tópico, como faço para carregar os aquivos já gravados no TMultiFile ?
MG

Olá Nataniel

Estou usando o seu exemplo como modelo para minha implementação, mas ao recuperar o nome do arquivo ele está envolto de caracteres especiais.

Devo fazer alguma transformação:

Como está vindo:

rename(tmp/%7B%22newFile%22%3A%22tmp%2Farrow-32-16.png%22%2C%22fileName%22%3A%22tmp%2Farrow-32-16.png%22%7D

Meu código.
  1. <?php
  2.     public function onUpload($param)
  3.     {
  4.         try {
  5.             $data $this->form->getData();
  6.             $objeto_id $param['objeto_id'];
  7.             TTransaction::open('app');
  8.             $i 1;
  9.             foreach($data->fotos as $foto) {
  10.                 
  11.                 $file_name "obj_{$data->objeto_id}_{$i}";
  12.                 $file $foto// define o nome enviado pelo cliente
  13.                 // define o dir de origem e destino do arquivo
  14.                 $source_file 'tmp/'.$foto;
  15.                 $target_file 'files/items/'.$file_name;
  16.                 
  17.                 // move o arquivo
  18.                 $moved rename($source_file$target_file);
  19.                 
  20.                 // se o arquivo foi movido, persiste no BD com nome
  21.                 // físico do sistema, e exclui da pasta temporario.
  22.                 if ($moved) {
  23.                     $objFoto = new ObjetoFoto();
  24.                     $objFoto->objeto_id $data->objeto_id;
  25.                     $objFoto->foto      $target_file;
  26.                     $objFoto->nome      $file;
  27.                     $objFoto->store();
  28.                     // remove o arquivo depois de movido e persistido no BD
  29.                     if (file_exists($target_file)) {
  30.                         unlink($target_file);
  31.                     }
  32.                 } else {
  33.                     TTransaction::rollback();
  34.                     throw new Exception('Erro ao mover o arquivo');
  35.                 }
  36.                 
  37.                 $i++;
  38.             }
  39.             TTransaction::close();
  40.             
  41.         } catch (Exception $e) {
  42.             TTransaction::rollback();
  43.             new TMessage('error'$e->getMessage());
  44.         }
  45.     }
  46. ?>
NR

Provavelmente você usou a função enableFileHandling, que adiciona alguns tratamentos para edit/delete das imagens. Nesse caso aconselho usar a função saveFiles da trait AdiantiFileSaveTrait, conforme exemplo abaixo:
https://adianti.com.br/framework_files/tutor/index.php?class=ProductForm&method=onEdit&id=1&key=1
MG

Nataniel, primeiro obrigado pelo retorno.

Estou tentando usar a trait, mas estou com um problema:

No *saveFile* eu estou passando os seguintes parâmetros. Estou num foreach.

$data = $this->form->getData();
foreach($data->fotos as $foto) ....
o nome do campo e "fotos", mas no foreach está foto"
Agora todo e qualquer parâmetro que passo no 3o. argumento o trati dá a mensagem:

Notice: Undefined property: stdClass::$fotos->foto in /mnt/c/Projetos/PHP/colecao/lib/adianti/base/AdiantiFileSaveTrait.php on line 28

Já tem 'foto' apenas e nada.

detalhe nem o *rename* faz a transferência da foto para esta pasta ou outra qualquer.

$this->saveFile($objFoto,$data,'fotos->foto','files/items');



NR

A função saveFile é para o componente TFile. Para o TMultiFile use a saveFiles(com S no final).
MG

Este método salva todas as imagens no direitório destino. Até aqui tudo bem, mas o nome dos arquivos que serão gravados devem seguir um padrão do meu sistema. O método apenas transfere com o mesmo nome e formato.
Por isso eu user
saveFile
num foreach, onde eu faço os ajustes que preciso e envio um a um.
E quando preciso informar o "photo_path", ele não reconhece.
NR

Marcelo, nesse caso talvez seja vantagem copiar a função saveFile pra dentro da classe e customizar conforme a necessidade
MG

Nataniel, depois que de responde eu fiz isso e funcionou.
Eu já estava pronto para postar a mensagem aqui.
Muito obrigado pela ajuda. Funcionou muito bem. Valeu!