Estudo da Classe FileReference (Flash 8)

Classe FileReference

Fala galera!

Primeiramente, gostaria de pedir desculpas pelo tempo que fiquei sumido… é que estou trabalhando em um projeto meio (bastante) complexo, correndo atrás de construir minha casinha e estou escrevendo esta coluna agora com a mão direita machucada… quem não sabe jogar bola é assim: escorrega na bola e cai em cima da própria mão!!

Mas vamos partir para o que interessa. No Flash 8, encontramos uma classe muito interessante, para que possamos trabalhar com upload e download de arquivos (lembra do input do tipo file no HTML???)

Uma das grandes diferenças da classe FileReference em relação ao tradicional upload por form de um HTML, é que ela possibilita saber a quantas anda nosso download/upload do arquivo!

A maior parte do trabalho com a classe é feita através de listeners. Aqui vão os eventos disparados pela classe que podem ser recuperados e tratados através de listeners:

  • onSelect (file:FileReference) : disparado quando o usuário seleciona o arquivo na caixa de diálogo;
  • onCancel (file:FileReference): disparado quando o usuário clica em cancelar na caixa de diálogo;
  • onOpen (file:FileReference): disparado quando se inicia um download ou upload de arquivo;
  • onProgress (bytesLoaded:Number, bytesTotal:Number, file:FileReference) : Informa a quantidade de bytes carregados/enviados, a quantidade de bytes total e o arquivo que está sendo feito upload/download;
  • onComplete: disparado ao completar um download / upload;
  • onHTTPError: disparado quando há algum erro no envio (upload) do arquivo;
  • onIOError: disparado quando há algum erro no recebimento (download) do arquivo;
  • onSecurityError: disparado quando há erros de segurança (por exemplo, tentando salvar em servidores diferentes);

Os métodos que podem ser invocados com uma instância de FileReference são:

  • addListener (listener:Object): objeto que servirá de ouvinte (listener);
  • browse ( [listadeTipos:Array] ): exibe a caixa de diálogo para procura de um arquivo para upload. O parâmetro lista de tipos, é um array de objetos contendo duas propriedades: description e extension. Por exemplovar img:Object = {description: “JPG Files (*.jpg)”, extension:”*.jpg; *.jpeg”};

    var txt:Object = {description: “Plain text files (*.txt)”, extension:”*.txt”};

    var listTypes:Array = new Array(img, txt);

  • cancel (void): cancela o download ou upload do arquivo;
  • download (url:String, [defaultName:String] ): inicia um download do arquivo. O parâmetro URL informa de onde está sendo feito o download do arquivo, e o parâmetro defaultName (opcional) informa um nome padrão para o arquivo.
  • removeListener (listener:Object): remove um ouvinte (listener) da lista de listeners do objeto FileReference.
  • upload (url:String): inicia o upload do arquivo para o endereço informado em URL.

E, finalmente, suas propriedades são:

  • creationDate:Date – Data de criação do arquivo ;
  • creator:String – Tipo de criador do arquivo (para Macintosh) ;
  • modificationDate:Date – Data de modificação do arquivo ;
  • name:String – Nome do arquivo ;
  • size:Number – Tamanho do arquivo ;
  • type:String – Tipo do arquivo.

Todas as propriedades são somente leitura.

Bom, agora que vimos o que temos para usufruir na classe FileReference, vamos trabalhar um pequeno exemplo com ela.

Abaixo, estão os links para os arquivos PHP que criei para esta coluna. Para não ficar muito extensa, resolvi colocar um link para o fonte deles, formatado pelo próprio PHP.

Você poderá fazer o layout da maneira que desejar. Fiz um layout bem simples para que possamos realizar nosso estudo. Todos os desenhos abaixos estão em uma única camada. Todos os botões são componentes Button. Os nomes em vermelho são os NOMES DE INSTÂNCIA de cada objeto.

Depois de nomear CORRETAMENTE os objetos no palco, iremos colocar as ações abaixo em uma NOVA CAMADA, para não misturar objetos com ações.

/** URL que serão usadas */

listaURL = “http://www.hufersil.com.br/mx/FileReference/lista.php”;

uploadURL = “http://www.hufersil.com.br/mx/FileReference/upload.php”;

downloadURL = “http://www.hufersil.com.br/mx/FileReference/arquivos/”;

/** importa a classe FileReference */

import flash.net.FileReference;

/** importa a classe para coluna de datagrid */

import mx.controls.gridclasses.DataGridColumn;

/** Var que checa se o está sendo feito download ou upload */

var busy:Boolean = false;

/** listener para upload de arquivos */

var lfr:Object = new Object();

/** tipos que podem ser feitos o upload */

var types:Array = new Array();

var imgFiles:Object = {description:”Imagens (*.jpg, *.jpeg, *.gif, *.png)”,extension:”*.jpg; *.jpeg; *.gif; *.png”};

/** coloca o tipo na matriz de tipos */

types.push(imgFiles);

/** quando o usuário selecionar o arquivo */

lfr.onSelect = function (file:FileReference):Void {

error.text += “Arquivo ” + file.name + ” selecionado, fazendo upload…” + newline;

/** já tenta fazer o upload */

if(busy == false) {

if(!file.upload(uploadURL)) {

error.text += “Falha na tentativa de upload do arquivo” + newline;

} else {

btn_cancela_upload.enabled = true;

busy = true;

btn_escolhe_arquivo.enabled = false;

}

}

}

lfr.onCancel = function (file:FileReference) {

error.text += “upload cancelado” + newline;

btn_cancela_upload.enabled = false;

btn_escolhe_arquivo = true;

busy = false;

barra_upload._xscale = 0;

}

lfr.onOpen = function(file:FileReference) {

error.text += “Arquivo aberto para download: ” + file.name + newline;

}

lfr.onProgress = function (f:FileReference, bl:Number, bt:Number):Void {

barra_upload._xscale = (bl/bt)*100;

}

lfr.onComplete= function (file:FileReference):Void {

error.text += “upload de ” + file.name+ ” completado” + newline;

btn_escolhe_arquivo.enabled = true;

btn_cancela_upload.enabled = false;

busy = false;

barra_upload._xscale = 0;

_loadXML.sendAndLoad(listaURL, lista_arquivos, “POST”);

}

lfr.onHTTPError = function(file:FileReference):Void {

error.text += “Erro de HTTP” + newline;

btn_escolhe_arquivo.enabled = true;

btn_cancela_upload.enabled = false;

busy = false;

barra_upload._xscale = 0;

}

lfr.onIOError = function(file:FileReference):Void {

error.text += “Erro de I/O” + newline;

btn_escolhe_arquivo.enabled = true;

btn_cancela_upload.enabled = false;

busy = false;

barra_upload._xscale = 0;

}

lfr.onSecurityError = function(file:FileReference, errorString:String):Void {

error.text += “Erro de segurança” + newline;

btn_escolhe_arquivo.enabled = true;

btn_cancela_upload.enabled = false;

busy = false;

barra_upload._xscale = 0;

}

var fr:FileReference = new FileReference();

fr.addListener(lfr);

/** cria uma instancia do FileReference para download */

var filedown:FileReference = new FileReference();

/** listener do filedownload */

var filedown_listener:Object = new Object();

filedown_listener.onProgress = function(obj:FileReference, bl:Number, bt:Number):Void {

barra_download._xscale = (bl/bt)*100;

}

filedown_listener.onIOError = function(obj:FileReference):Void {

error.text += “Erro de IO”;

btn_cancela_download.enabled = false;

busy = false;

barra_download._xscale = 0;

btn_escolhe_arquivo.enabled = true;

}

filedown_listener.onHTTPError = function(obj:FileReference):Void {

error.text += “Erro de HTTP”;

btn_cancela_download.enabled = false;

busy = false;

barra_download._xscale = 0;

btn_escolhe_arquivo.enabled = true;

}

filedown_listener.onSecurityError = function (obj:FileReference):Void {

error.text += “Falha de segurança para download”;

btn_cancela_download.enabled = false;

busy = false;

barra_download._xscale = 0;

btn_escolhe_arquivo.enabled = true;

}

filedown_listener.onCancel = function (obj:FileReference):Void {

error.text += “O download de ” + obj.name + ” foi cancelado”;

btn_cancela_download.enabled = false;

busy = false;

barra_download._xscale = 0;

btn_escolhe_arquivo.enabled = true;

}

filedown_listener.onComplete = function(obj:FileReference):Void {

error.text += “Download de ” + obj.name + ” completado”;

btn_cancela_download.enabled = false;

busy = false;

barra_download._xscale = 0;

btn_escolhe_arquivo.enabled = true;

}

filedown.addListener(filedown_listener);

/** listener do DataGrid */

var lista_listener:Object={};

lista_listener.cellPress = function (evt:Object) {

var it:Object = lista.getItemAt(Number(evt.itemIndex));

/** se encontrar o objeto que foi selecionado na lista */

if(it && busy == false) {

/** tenta inicia o download */

if(! filedown.download(downloadURL + it.name, it.name) ) {

error.text = “Não foi possível abrir a caixa de dialogo para salvar o arquivo”;

} else {

btn_cancela_download.enabled = true;

btn_escolhe_arquivo.enabled = false;

busy = true;

}

}

}

/** adiciona o listener */

lista.addEventListener(“cellPress”,lista_listener);

/** Cria as colunas desejamos que apareçam */

var c_name:DataGridColumn = new DataGridColumn(“name”);

c_name.headerText = “Nome”;

c_name.width = 150;

var c_date:DataGridColumn = new DataGridColumn(“creation”);

c_date.headerText = “Data de criação”;

c_date.width = 250;

/** Adiciona as colunas */

lista.addColumn(c_name);

lista.addColumn(c_date);

/** deixa os botões de cancelar inativos */

btn_cancela_download.enabled = btn_cancela_upload.enabled = false;

/** coloca as barras de progressão com 0 de _xscale */

barra_download._xscale = barra_upload._xscale = 0;

/** ações para o botão de cancelar o download */

var cancela_download:Function = function ():Void {

filedown.cancel();

btn_cancela_download.enabled = false;

busy = false;

barra_download._xscale = 0;

}

btn_cancela_download.addEventListener(“click”, cancela_download);

/** ações para o botão de cancelar o upload */

var cancela_upload:Function = function ():Void {

fr.cancel();

btn_cancela_upload.enabled = false;

btn_escolhe_arquivo.enabled = true;

busy = false;

barra_upload._xscale = 0;

}

btn_cancela_upload.addEventListener(“click”, cancela_upload);

/** botão para escolher o arquivo para upload */

var escolhe_arquivo:Function = function ():Void {

fr.browse( types );

}

btn_escolhe_arquivo.addEventListener(“click”, escolhe_arquivo);

/** XML para carregar a lista de arquivos */

var lista_arquivos:XML = new XML();

lista_arquivos.ignoreWhite = true;

lista_arquivos.onLoad = function () {

lista.removeAll();

var node:XMLNode = this.firstChild.firstChild;

for(node; node!=null; node=node.nextSibling) {

lista.addItem(node.attributes);

}

}

/** utilizamos um objeto loadvars para não ficar no cache */

var _loadXML:LoadVars = new LoadVars();

_loadXML.sendAndLoad( listaURL, lista_arquivos, “POST”);

E aqui, está um exemplo dele funcionando!

http://www.hufersil.com.br/mx/FileReference/

@braços e fiquem com Deus!

Escrito por hugo on novembro 4, 2005. Arquivado em Flash. Você pode seguir as respostas a esse artigo pelo RSS 2.0. Você pode deixar respostas para esse artigo

7 respostas a Estudo da Classe FileReference (Flash 8)

  1. Ola, achei muito interessante, e útil pra mim, mas como não manjo nada de php gostaria que me disponibilizasse o código php (os links estão quebrados)
    Abraço!!

  2. Ola Amigo, teria como disponibilizar os arquivo .php?

    Obrigado

  3. Olá os links estão quebrados!!!
    Upload de arquivos;
    Lista os arquivos;
    Preciso dos arquivos ve se deixam as coisa em ordem!!

  4. ponham ae o codigo fonte do php….. pk os links tao todos quebrados e este tutorial sem o php nao vale de muito….;) cumps

  5. Esse estudo é muito bom mesmo!

    Pena que os links estejam quebrados :( ((

  6. Olá!! alguem que conhece o Hugo ou o administrador do site poderia disponibilizar o conteudo dos links quebrados!!!

  7. muito bom tuto mais tem q consertar os links quebrados ;)

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>