DEMIS BUCCI (50 pts)

GABRIEL SPORCH (53 pts)

PANDOGO (82 pts)

MAURO ROCHA TAVARES (40 pts)

LUIZ AVANCI (51 pts)

DEN IVANOV (260 pts)

RODRIGO AMARAL (56 pts)

DENIS CARAVALHO (85 pts)

STICKMAN (155 pts)

RICARDO TAKAHASHI (180 pts)

KEN AWAMURA (130 pts)

AMAURY BENTES (123 pts)
Treinamento PontoFlash de Flash e ActionScript

Gostaria de saber se tem como ao clicar em uma imagem pequena, abrir uma janela maior com a imagem ampliada.

Quero saber mais sobre interação Flash X banco de dados (sql mysql etc).

Porque um campo de texto (text field) com uma rotação de 90 graus desaparece?

Como simular um texto sendo digitado, como uma máquina de escrever?

Como mostrar a posição X e Y de uma figura em uma página?

Como alterar dinamicamente o tipo e o background de um campo de texto?

Como calcular a raiz quadrada de um número?

Preciso fazer um objeto seguir o mouse (arrastando) somente no horizontal.

Plugin do Flash Player

Quero que um filme aberto com load movie, abra no frame 15.

Como reproduzir o efeito Scan Lines no Flash?

Como reproduzo aquele efeito de espelho?

Quero fazer um efeito ALT (tooltip) num botão do Flash.

Queria usar no meu formulário o CGI de outro domínio.
Macromedia Flex

Jogo da Forca

A história do Flash.

Alterando Artistic Media no Corel Draw

LocalConnection

Sub-Menus entre frames, com o Dreamweaver

Desenvolvendo um Controle de Volume Customizado em Flash

Utilizando o ScrollPane no Flash MX.

Conceitos de Design - Apresentação.

Janelas pop-up e semi-full no flash

Tracejado no Fireworks

Máscara arrastável no Flash 4.
Televisão

Drag Mask 2

Contador continuo

Cerca

Pintar2

Fotos banner

Triangulos2

Caleidoscópio

Cursor customizado relativo

Mouse 3d

Textfind

Menu pastas
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