JD
[DUVIDA] TFile - Upload de vários arquivos simultaneamente
Fechado
Olá pessoal, durante o desenvolvimento de uma aplicação eu necessitei utilizar um TFile, movido pela curiosidade resolvi entender como funciona o processo de upload de arquivos que o TFile faz antes do submit do form.
Então localizei os seguintes arquivos:
lib/adianti/include/components.min.js
lib/adianti/include/tfile/tfile.js
lib/adianti/service/AdiantiUploaderService.php
Pois bem, ao analisar os arquivos eu constatei que um TFile só é capaz de enviar um único arquivo, pensei em varias maneiras para faze-lo enviar vários arquivos e a maneira que me veio em mente foi a seguinte:
1 - Modifiquei o arquivo "libraries.html" trocando a requisição do arquivo "lib/adianti/include/components.min.js" para "lib/adianti/include/components.js"
2 - Modifiquei o arquivo "lib/adianti/include/tfile/tfile.js"
trocando isso:
Por isso:
3 - Modifiquei o arquivo "lib/adianti/service/AdiantiUploaderService.php" para:
Então localizei os seguintes arquivos:
lib/adianti/include/components.min.js
lib/adianti/include/tfile/tfile.js
lib/adianti/service/AdiantiUploaderService.php
Pois bem, ao analisar os arquivos eu constatei que um TFile só é capaz de enviar um único arquivo, pensei em varias maneiras para faze-lo enviar vários arquivos e a maneira que me veio em mente foi a seguinte:
1 - Modifiquei o arquivo "libraries.html" trocando a requisição do arquivo "lib/adianti/include/components.min.js" para "lib/adianti/include/components.js"
2 - Modifiquei o arquivo "lib/adianti/include/tfile/tfile.js"
trocando isso:
var file = fileInput.files[0];
formData.append('fileName', file);
Por isso:
var files = fileInput.files;
var nameData = 'fileName[]';
for (var i = 0; i < files.length; i++)
{
formData.append(nameData, files[i]);
}
3 - Modifiquei o arquivo "lib/adianti/service/AdiantiUploaderService.php" para:
<?phpnamespace Adianti\\Service;/** * File uploader listener * * @version 2.0 * @package service * @author Nataniel Rabaioli * @author Pablo Dall'Oglio * @copyright Copyright (c) 2006-2014 Adianti Solutions Ltd. (http://www.adianti.com.br) * @license http://www.adianti.com.br/framework-license */class AdiantiUploaderService { private function reArrayFiles($file_post) { $file_ary = array(); $file_count = count($file_post['name']); $file_keys = array_keys($file_post); for ($i = 0; $i < $file_count; $i++) { foreach ($file_keys as $key) { $file_ary[$i][$key] = $file_post[$key][$i]; } } return $file_ary; } function show() { $folder = 'tmp/'; $response = array(); $_FILES['fileName'] = $this->reArrayFiles($_FILES['fileName']); if (count($_FILES['fileName']) > 0) { foreach ($_FILES['fileName'] as $file) { if ($file['error'] === 0 && $file['size'] > 0) { $path = $folder . $file['name']; if (is_writable($folder)) { if (move_uploaded_file($file['tmp_name'], $path)) { $response['type'] = 'success'; $response['fileName'] = $file['name']; } else { $response['type'] = 'error'; $response['msg'] = ''; } } else { $response['type'] = 'error'; $response['msg'] = "Permission denied: {$path}"; } } } echo json_encode($response); } }}?>
O código funcionou perfeitamente, agora o TFile pode enviar varios arquivos é só usar:
<?php $photo = new TFile('photo'); $photo->setProperty("multiple", true);?>
A minha dúvida é se eu fiz da maneira correta? E se há uma maneira de fazer isso sem ter que alterar os fontes do framework?
Obrigado.
Jheferson, tudo bem?
Também precisei dessa função, mas acabei deixando para desenvolver essa parte no final do meu projeto.
Segundo nosso amigo Pablo, nessa nova versão do Framework 3, foi desenvolvido uma nova classe chamada TMultiFile.
Não testei ainda mas segundo o Pablo essa classe faz o que você precisa.