SASHA GUDEY (235 pts)

BÁRBARA TOSTES (64 pts)

JONAS GALVEZ (521 pts)

MANGOOST (80 pts)

GÉRIO (93 pts)

KEN AWAMURA (130 pts)

AMAURY BENTES (123 pts)

ÉMERSON ROCHA (85 pts)

NETO LEAL (116 pts)

LUIZ AVANCI (51 pts)

DENIS CARAVALHO (85 pts)

JOTA LAGO (40 pts)
Treinamento PontoFlash de Flash e ActionScript

Como colocar uma página em FullScreen?

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

Como fazer um cronômetro disparado por um botão no flash MX?

Existe um modo de fazer tellTarget em vários MCs ao mesmo tempo?

Como fazer um load movie para um local específico?

Como classificar um array por um de seus itens?

Como aplicar um efeito alpha (fade out) em um outro swf de nivel superior aberto através do loadmovie?

Há uma forma de modificar a aprência de um compontente scrollbar ou scrollpane?

Como controlar uma cena com um botão dentro do Movieclip?

Para que serve o ONIO SKIN?

E o FlashMX não aceita eval para gerar uma variável?

Para que usar onClipEvent?

Efeito fade (alpha gradativo) de um objeto em colisão.

Porque um campo de texto (text field) com uma rotação de 90 graus desaparece?
Entendendo como funciona um preloader - Segunda parte

Máscara arrastável no Flash 5.

GetMySQLData para Flash5 (segunda parte)

Desenho de letras - construindo fontes .TTF. no Corel Draw.

Chromeless com Flash.

Animate - Fireworks

Fórmula do efeito de elasticidade

Máscara arrastável no Flash 4.

Colisão

Programando objetos 3D em Plataformas 2D como a do Flash

Botão estilo Apple, feito no Flash.

Novas propriedade de botões no FireworksMX
Airos 2

Emotion

Coordinate cube

Spiral show

Spyral draw

Lightings

Cubos vivos

InfoForm

Menu abre pasta

Menu Tsunami

3d cube2

Globo girando
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