KEN AWAMURA (130 pts)

GABRIEL SPORCH (53 pts)

AMAURY BENTES (123 pts)

JONAS GALVEZ (521 pts)

LUIZ HERRERA (117 pts)

DAUTON JANOTA (255 pts)

AUTOR DESCONHECIDO (100 pts)

EDUARDO PERROUD (52 pts)

ZEBEDIAH (35 pts)

EDUARDO WALMOTT (226 pts)

HELEN TRIOLO (444 pts)

ÉMERSON ROCHA (85 pts)
Treinamento PontoFlash de Flash e ActionScript

Como fazer o FSCommand executar um outro arquivo no FlashMX?

Como fazer um cronômetro regressivo, com botão pause, stop e play.

Como passar parâmetros para um arquivo swf por meio de uma página html?

Como simular uma animação de um círculo sendo criado dinamicamente?

Abrir janelas popups à pertir de imagens.

No Flash tem uns gradientes pré definidos: como eu faço para edita-los (inserir ou alterar)?

Vi que o único jeito de ter alguma coisinha legal no swift 3d e importando do illustrator?

Como alterar duas propriedades de um objeto num só evento de um botão?

Preciso de um sisteminha em FLASH para cadastrar emails de visitantes.

É possível mudar a cor da fonte de um texto dinâmico via Action?

Como desabilitar o botão direito do Mouse num executável?

Contagem regressiva de data

Como carregar uma imagem JPEG, com local e tamanho pré-definidos?

Quero tocar 3 vezes um som e depois da terceira vez, iniciar outro som.
Gráfico pizza.

Interação de Flash+Asp.

Rotacionar objetos 3D no Flash.

Máscara arrastável no Flash 5.

Inserir dados no ASP via formulário no Flash.

Animate - Fireworks

Objeto Movieclip - Propriedades

Scroll - Rolagem de textos e Imagens

Máscara arrastável no Flash 4.

Criando um verificador de campos de um formulário.

Controlando um swf que está em outro frame

Spectrum Analizer - Medidores de som
Dots2a

Menu Tsunami

Transição

Gravidade

Cleopalyer

Movimento

Starshiner

Tornado

Menu animado

Fotos banner

3D cube

Drag circling
HOME | TUTORIAIS
Download de arquivos com a classe File Reference
por Leandro Amano

 

Conhecimentos: Este artigo pede um conhecimento intermediário de ActionScript, é necessário ter conhecimento e familiaridade com os componentes do Flash.

Bom, um detalhe muito importante antes de tudo, é que estamos no Macromedia Flash 8, antes disso a classe File Reference não existia.

O Flash anterior a esta versão não conseguia disponibilizar downloads através do Flash, pois o Flash não conseguia obter informações do que estava acontecendo com o Download, isso era muito complicado pois o desenvolvedor tinha que chamar uma outra janela em formato HTML para que o usuário selecionasse o arquivo para download, em termos de arquitetura isso ficava horrível pois o site era todo em Flash, e eis que de repente surge uam janela popUp em JavaScript exibindo os possíveis downloads... Pois bem, agora isso foi resolvido com a classe File Reference que nos retorna todos os possíveis eventos que possam vir a acontecer, desde o que fazer no início do download até o que retornar caso o download não exista.
Não explicarei com detalhes o que são classes, pacotes nem propriedades, métodos e eventos de Componentes, vou deduzir que o público alvo já entenda esses pré-requisitos, caso a demanda de perguntas sobre teorias e práticas sobre esses assuntos seja grande, abordaremos em uma breve data. Isso não significa que alguém não possa fazer, todo aquele que seguir este passo a passo chegará ao mesmo trabalho que eu cheguei.

Começando, no Flash Document (8) em branco:

Vamos clicar no painel Window, Components, e vamos arrastar para o palco os respectivos components para layers de mesmo nome, que criaremos conforme o drag:
No nó User Interface, assaste para o palco um component List, nome de instância $list e nome da layer List;
Crie uma nova layer com o nome TextArea, arraste um TextArea com o nome de instância $textArea ;
Faça o mesmo para os components Button: $button e ProgressBar: $progressBar.

Os tamanhos dos meus objetos foram alterados manualmente:
$list: 200: width, 200: height.
$textArea: 455: width, 200: height.

Crie um layer para as Actions de nome: as.

Vamos ter algo parecido com isso:

A partir desse momento tudo ficará na layer as (action script), portanto se os objetos foram declarados com os nomes corretos tudo dependerá de digitação e mais tarde entendimento sobre cada uma das ações.
Vamos antes de qualquer coisa importar todas as classes que iremos trabalhar:

import mx.utils.Delegate;
import mx.controls.ProgressBar;
import mx.controls.List;
import mx.controls.TextArea;
import mx.controls.Button;
import flash.net.FileReference;

Importar as classes irá ao mínimo nos poupar digitação num projeto mais longo, iremos ver mais a frente.
Abaixo disso vamos declarar algumas variáveis que vamos trabalhar neste artigo:
OBS: as URLS estão sendo direcionadas para o meu site, mas qualquer URL com arquivo é válida.

var $url1:String = "http://www.leandroamano.com.br/colunas/source/download.zip";
var $nome1:String = "Download";
var $nomeDownload1 = "download.zip";
var $descricao1:String = "Download do arquivo download.zip";

var $url2:String = "http://www.leandroamano.com.br/colunas/source/mediaPlayer.fla";
var $nome2:String = "Media Player MX 2004";
var $nomeDownload2 = "mediaPlayer.fla";
var $descricao2:String = "Download do arquivo mediaPlayer.fla";

A partir dessas variáveis, vamos inseri-las no List como propriedades de objetos que já será adicionado ao List, claro que poderiam ser criados mais itens e mais propriedades, isso fica a critério de cada um:

$list.addItem({label:$nome1, download:$url1, nome:$nomeDownload1, descricao:$descricao1});
$list.addItem({label:$nome2, download:$url2, nome:$nomeDownload2, descricao:$descricao2});

Agora precisamos dizer ao component List o que fazer com esses dados, então precisamos de um escutador de eventos, é ele quem vai ficar prestando atenção em qualquer alteração que o nosso List fizer, nesse caso, vamos dizer a ele que ao trocar sua descrição será enviada para o TextArea:

var $selecionado:Object = new Object();
$selecionado.change = $mudaArquivo;
function $mudaArquivo(evtObj:Object):Void {
$textArea.text += evtObj.target.selectedItem.descricao+newline;
}
$list.addEventListener("change", $selecionado);

No final da linha de adição ao TextArea, reparem que inserimos um newline, é ele no Flash que nos permite pular linhas, também poderiamos usar \\\\n, <br>, mas isso não vem ao caso... Uma outra coisa importante de observar é que a propriedade text incrementa novos valores, e não substitui, por isso o incrementador +=.
Vamos agora dizer ao Flash que a primeira opção já deve vir selecionada por Default.

$list.selectedIndex = 0;
$list.dispatchEvent({type:"change", target:$list});

Não basta pedirmos ao Flash que simplesmente coloque o item na posição zero, temos que pedir o dispatch, isso nos permite disparar o evento antes que o mesmo ocorra pela interação do usuário.
Vamos agora retirar a possibilidade do usuário modificas o TextArea:

$textArea.editable = false;

Vamos também setar no Flash que a barra de progresso terá a propriedade mode ativada, já que precisaremos lhe mostrar quem são os bytes totais e carregados:

$progressBar.mode = "manual";

Configuraremos agora nosso botão, é ele quem vai disparar o evento de download do arquivo desejado:

function $chamaDownload():Void {
var $downloadIsDefined:Boolean = ($list.selectedIndex>=0);
if ($downloadIsDefined) {
$downloadArquivo.download($list.selectedItem.download, $list.selectedItem.nome);
}
}
$button.label = "Download";
$button.onPress = Delegate.create(this, this.$chamaDownload);

Basicamente criamos uma função onde se o objeto selecionado no item for maior ou igual a zero, podemos chamar o download. O Download pede dois parâmetros, url e nome do arquivo a ser salvo, os dois tipos de dados são Strings.

Também nomeamos seu label (rótulo) como "Download", e ao pressionarmos o botão chamamos a classe Delegate, nesse caso foi criada apenas para não precisar criar um ouvidor (listener), seus parâmetros são respectivamente escopo e função.

Até agora com exceção do download já haviamos conhecido tudo em versões anteriores, a partir desse momento estaremos utilizando os principais eventos para Download e Upload disponíveis. Trataremos do upload em breve.
Abaixo do que havíamos digitado, continuemos:

var $downloadArquivo:FileReference = new FileReference();
var $ouvinteDownload:Object = new Object();

Estou declarando agora meu escutador ($ouvinteDownload) do objeto de download ($downloadArquivo), se não tivessemos importado a classe acima, teriamos que declarar assim: var $downloadArquivo:flash.net.FileReference = new flash.net.FileReference();
Listando seus principais eventos:

// Avisa que o arquivo de download foi selecionado
$ouvinteDownload.onSelect = function(file:FileReference):Void {
$textArea.text += "O arquivo "+file.name+" foi selecionado."+newline;
};

// Avisa que o arquivo de download foi cancelado
$ouvinteDownload.onCancel = function(file:FileReference):Void {
$textArea.text += "O download foi cancelado."+newline;
};

// Avisa que o download foi iniciado
$ouvinteDownload.onOpen = function(file:FileReference):Void {
$textArea.text += "O download do arquivo "+file.name+" foi iniciado para download."+newline;
};

// Avisa que arquivo de download está em progresso, é agora que chamamos a barra de progresso, mostrando quem são os bytes carregados e bytes totais
$ouvinteDownload.onProgress = function(file:FileReference, carregados:Number, total:Number):Void {
$progressBar.setProgress(carregados, total);
};

// Avisa que o download foi concretizado, a barra de download agora chegou ao fim, deve se encontrar a 100 por 100
$ouvinteDownload.onComplete = function(file:FileReference):Void {
$textArea.text += "Download do arquivo "+file.name+" completo."+newline;
$progressBar.setProgress(100, 100);
};

// Avisa que ocorreu um erro com o Download, existem mais eventos específicos para tratamentos de erros como onHTTPError e onSecurityError.
$ouvinteDownload.onIOError = function(file:FileReference):Void {
$textArea.text += "Arquivo "+file.name+" inexistente ou falha de segurança."+newline;
};

E para finalizar adicionamos o ouvidor ao objeto de download:

$downloadArquivo.addListener($ouvinteDownload);

Simples não é? A partir de agora nunca mais precisaremos abrir janelas popUp ou chamar outras páginas desagradáveis para chamar um download.

O código inteiro:

import mx.utils.Delegate;
import mx.controls.ProgressBar;
import mx.controls.List;
import mx.controls.TextArea;
import mx.controls.Button;
import flash.net.FileReference;
//
var $url1:String = "http://www.leandroamano.com.br/colunas/source/download.zip";
var $nome1:String = "Download";
var $nomeDownload1 = "download.zip";
var $descricao1:String = "Download do arquivo download.zip";
var $url2:String = "http://www.leandroamano.com.br/colunas/source/mediaPlayer.fla";
var $nome2:String = "Media Player MX 2004";
var $nomeDownload2 = "mediaPlayer.fla";
var $descricao2:String = "Download do arquivo mediaPlayer.fla";
$list.addItem({label:$nome1, download:$url1, nome:$nomeDownload1, descricao:$descricao1});
$list.addItem({label:$nome2, download:$url2, nome:$nomeDownload2, descricao:$descricao2});
var $selecionado:Object = new Object();
$selecionado.change = $mudaArquivo;
function $mudaArquivo(evtObj:Object):Void {
$textArea.text += evtObj.target.selectedItem.descricao+newline;
}
$list.addEventListener("change", $selecionado);
$list.selectedIndex = 0;
$list.dispatchEvent({type:"change", target:$list});
//
$textArea.editable = false;
//
$progressBar.mode = "manual";
//
function $chamaDownload():Void {
var $downloadIsDefined:Boolean = ($list.selectedIndex>=0);
if ($downloadIsDefined) {
$downloadArquivo.download($list.selectedItem.download, $list.selectedItem.nome);
}
}
$button.label = "Download";
$button.onPress = Delegate.create(this, this.$chamaDownload);
//
var $downloadArquivo:FileReference = new FileReference();
var $ouvinteDownload:Object = new Object();
$ouvinteDownload.onSelect = function(file:FileReference):Void {
$textArea.text += "O arquivo "+file.name+" foi selecionado."+newline;
};
$ouvinteDownload.onCancel = function(file:FileReference):Void {
$textArea.text += "O download foi cancelado."+newline;
};
$ouvinteDownload.onOpen = function(file:FileReference):Void {
$textArea.text += "O download do arquivo "+file.name+" foi iniciado para download."+newline;
};
$ouvinteDownload.onProgress = function(file:FileReference, carregados:Number, total:Number):Void {
$progressBar.setProgress(carregados, total);
};
$ouvinteDownload.onComplete = function(file:FileReference):Void {
$textArea.text += "Download do arquivo "+file.name+" completo."+newline;
$progressBar.setProgress(100, 100);
};
$ouvinteDownload.onIOError = function(file:FileReference):Void {
$textArea.text += "Arquivo "+file.name+" inexistente ou falha de segurança."+newline;
};
$downloadArquivo.addListener($ouvinteDownload);


Usei praticamente o mesmo exemplo em meu site: www.leandroamano.com.br a diferença única são os dados em XML.

Faça o download aqui do arquivo.

Grande abraço e até a próxima!



Devido à reformulação implementada no site, pode ser que você encontre alguns links quebrados. Por favor, ajude-nos a corrigir eventuais problemas nos informando links quebrados
0 comentário





Visite o perfil de LEANDRO AMANO no portal PontoFlash

Atualmente é designer, Macromedia User Group Leader, sócio da Amano & Venegas, instrutor Macromedia na ENG DTP & Multimídia em São Paulo - SP e instrutor de Pós Graduação de Engenharia de WebSites na Unicsul - SP. Site pessoal www.leandroamano.com.br