Boa noite pessoal!
Estou postando o código-fonte do projeto que estou desenvolvendo para envio múltiplo de arquivos usando Actionscript 3 e PHP como prometido no post anterior (recomendo ler, pois a base está mais bem explicada).
Neste post você vai ver como implementei o plugin jQuery ProgressBar 1.2 para apresentar o progresso do envio dos arquivos. Para iniciar, além do plugin você vai precisar (pra que não sabe
) do jQuery que é uma excelente biblioteca Javascript que eu uso o tempo todo pra facilitar na programação.
Bom, agora vamos aos códigos. Abaixo vou postar diferenças entre o código anterior:
function selectHandler(e:Event):void { // Retorna os arquivos selecionados var arqs:FileReferenceList = FileReferenceList(e.target); // Seta a array com os arquivos selecionados selecionados = arqs.fileList; // Total de arquivos selecionados var total:Number = selecionados.length; // Objeto que será enviado para o Javascript com os arquivos selecionados var arquivos:Array = []; // Monta o objeto que será enviado for (var i:Number = 0; i < total; i++) { // FileReference do arquivo atual var arq:FileReference = FileReference(selecionados[i]); // Cria o objeto com as informações do arquivo para ser adicionado na Array var obj:Object = { id: i, nome: arq.name, tamanho: arq.size, tipo: arq.type }; // Adiciona o objeto na Array arquivos.push(obj); } // Executa a função Javascript enviando o objeto ExternalInterface.call("adicionaArquivos", arquivos); // Envia o primeiro arquivo da array enviar(0); }
Ao selecionar os arquivos, o Flash já os envia em uma array com informações (nome, tamanho, tipo) pela função “adicionaArquivos” no Javascript.
function enviar(i:Number):void { // URL do script php para o upload var url:URLRequest = new URLRequest("http://localhost/upload.php"); // Arquivo a ser enviado var arq:FileReference = FileReference(selecionados[i]); // Evento que dispara quando o Flash recebe um retorno do script php arq.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, completeHandler); // Evento que dispara quando ocorre um erro de entrada/saída arq.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); // Evento que dispara sempre que há uma mudança no progresso do envio arq.addEventListener(ProgressEvent.PROGRESS, progressHandler); try { // Envia o arquivo arq.upload(url); } catch (erro:Error) { log("Ocorreu um erro ao enviar o arquivo "+arq.name); } }
A função “enviar” está adicionando o evento para capturar o progresso do envio. E na função “completeHandler” também adicionei o código necessário para remover o evento de progresso.
// Progresso do envio function progressHandler(e:ProgressEvent):void { // Seta a variavel com a referencia do arquivo enviado var arq:FileReference = FileReference(e.target); log("Progresso do arquivo " + arq.name + ": " + e.bytesLoaded + " / " + e.bytesTotal); // Envia a porcentagem para o Javascript ExternalInterface.call("progresso", atual, Math.round(e.bytesLoaded / e.bytesTotal * 100)); }
Adicionei a função “progressHandler” para notificar o progresso atual do arquivo por intermédio da função “progresso” criada via Javascript.
Obs.: Não esqueça de alterar a URL do seu script de upload.
O restante continua o mesmo código AS3. O código PHP também continua o mesmo. No final deste post você pode baixar o código-fonte completo com todos os arquivos utilizados.
Agora o código Javascript (comum.js) que utilizei para comunicação com o Flash:
// Recebe um objeto com os arquivos selecionados e suas informações function adicionaArquivos(arquivos) { // Número de arquivos selecionados var num = arquivos.length; // Faz o loop para mostrar todos os arquivos na página for (var i = 0; i < num; i++) { // Arquivo atual var arq = arquivos[i]; // id do arquivo para manter referência com o Flash var id = arq.id; // Exibir no máximo 32 caractéres no nome do arquivo var nome = (arq.nome.length > 32) ? arq.nome.substring(0, 29) + "..." : arq.nome; // Adiciona uma div com o nome do arquivo na div "#arquivos" e cria a barra de progresso $('<div class="arquivo"><label>'+nome+':</label></div>').appendTo("#arquivos") .append($('<span id="upload_'+id+'" />').progressBar({ barImage: 'images/progressbg_green.gif' })); } } function progresso(id, valor) { // Atualiza a porcentagem da barra de progresso $("#upload_"+id).progressBar(valor); } function uploadFinalizado() { $("body").append('<div>Todos os arquivos foram enviados.</div>'); }
E o código HTML:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <title>Upload</title> <script type="text/javascript" src="_js/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="_js/jquery.progressbar.js"></script> <script type="text/javascript" src="_js/comum.js"></script> <style type="text/css"> div, span { font-family: Arial; font-size: 11px; } .arquivo label { display:inline; width:180px; margin-right:10px; float:left; } </style> </head> <body> <object data="_swf/upload.swf" name="uploader" id="uploader" type="application/x-shockwave-flash" height="32" width="80"> <param value="false" name="menu"> <param value="always" name="allowScriptAccess"> </object> <div id="arquivos"></div> </body> </html>
Espero que o código esteja bem explicado e que seja útil. Por favor, postem comentários, dúvidas, sugestões, etc…
Todos os arquivos utilizados:
|
|
download: upload_progresso.rar (34.78KB) added: 05/05/2009 clicks: 2930 description: Código-fonte |

Olá Fredi,
Achei seu post no google quando corria atras de algo para multiplo upload de arquivos usando flash e html.
Gostaria de saber se é possivel processar campos do html com o flash.
Tenho um campo de opções que resgata nome de galerias cadastradas no mysql, gostaria de poder selecionar um nome para cadastrar junto com o upload das fotos.
Obrigado pelo seu Post, valeu meu dia de estudos aqui ! =)
Grande abraço!
Carlos Braga
13/05/2009 @ 5:42 pm
Oi Carlos, tudo bem?
No meu sistema eu faço um cadastro de galeria (ou álbuns) somente com as informações iniciais, depois de cadastrado eu faço ele abrir a galeria e então mostro a opção de adicionar imagens. Tem como enviar variáveis, mas como cada arquivo executa novamente o script de upload, não seria a melhor solução para já cadastrar a galeria no banco por exemplo. Em vez disso eu mando o ID da galeria e o ID da sessão PHP para o script salvar as imagens na pasta certa e verificar se o usuário está logado.
Em breve vou postar a versão mais atual desta solução de upload em uma Classe Actionscript, com um controle bem mais completo sobre todos os eventos do upload via Javascript. Ai não vai mais ser preciso se preocupar com o código Actionscript 3, pois da pra controlar tudo pelo Javascript.
Abraço!
14/05/2009 @ 3:57 pm
Olá Fredi!
Gostei muito do seu POST, a tempos venho procurando algo que fizesse isso. O problema é que quando envio arquivos pela primeira vez acontece como esperado, ele envia todos os arquivos para o servidor, mas, quando eu tento enviar novamente sem recarregar a pagina além dele não funcionar as barras de progresso ele envia apenas um dos arquivos.
Gostaria de ver com você se você tem em mente alguma coisa que corrija esse problema.
Por enquanto estou tentando aqui e caso eu mesmo consiga encontrar alguma coisa que contorne esse problema voltarei a postar.
Muito obrigado e parabéns!
03/06/2009 @ 3:04 pm
Oi Walison, tudo certo?
Quero postar logo a última versão desta solução em upload, que é muito mais flexível do que esta. Acho que neste fim de semana já consigo um tempo para colocá-la aqui.
Obrigado! Abraço!
04/06/2009 @ 9:14 am
Olá Fred,
o post é muito bom, mas preciso dessa mesma galeria integrada com o codeigniter.
esta funcionando perfeitamente, mas na hora de salva as imagens ele nao salva as imagens na pasta selecionada.
você teria alguma soluçao para isso?
28/10/2011 @ 8:53 am