DAUTON JANOTA (255 pts)

ÉMERSON ROCHA (85 pts)

NILTON BICALHO (61 pts)

RICARDO FIGUEIRA (33 pts)

ZECA BALA (45 pts)

IRAPUAN MARTINEZ (45 pts)

RODRIGO AMARAL (56 pts)

MARLOS ALVES CARMO (90 pts)

MANGOOST (80 pts)

AUTOR DESCONHECIDO (100 pts)

KEN AWAMURA (130 pts)

RICARDO TAKAHASHI (180 pts)
Treinamento PontoFlash de Flash e ActionScript

Qual é a melhor maneira de transformar MP3 para Wav? E qual é a melhor de usar?

Como enviar comandos para uma variável aberta com loadVariables?

Como faço para fazer um autorun?

Alguém poderia me dizer o que é streaming?

Como transformar a data 10/01/2002 em 10 de janeiro de 2002?

Importar variáveis de um TXT, com loadVars em um compontente scrollBar (rolagem).

Gostaria de fazer um sistema de login e senha no flash com ASP.

Como fazer um objeto desfocado em movimento?

Como mudar a cor do mouse over de 23 botões, por uma única actionscript?

Gostaria de no mouse over sobre um texto, ele parasse, e no mouse out, prosseguisse de onde parou.

Objeto Cookie no Flash que grava arquivos XML.

Como coloco diversas horas ao mesmo tempo, de acordo com o fuso horário?

Como fazer um autoRun para um executável do Flash?

Contagem regressiva de data
Desenho de letras - construindo fontes .TTF. no Corel Draw.

O desenho animado abrindo sites.

Botão Radio.

Como fatiar um site modelo portal no Fireworks

Controlando MovieClip pelas teclas direcionais.

A história do Flash.

Create TextField.

Novas propriedade de botões no FireworksMX

Clica nuaicon - Photoshop 6

Download de arquivos com a classe File Reference

Como arredondar os cantos de uma foto no Fireworks.

Labirinto - Plataforma de jogo em terceira pessoa em flash 5: 1° parte
Efeito blur

Text lights 2

Liquidimage

Cerca

Mouse 3d

Pop menu

Calculando horas

Um por vez

Rachadura

DragVariable

Marquee

Easy preloader
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