Curso AS3

Upload usando apenas FileReference

O amigo Guilherme postou a pouco em meu fórum um dúvida a respeito de upload usando apenas o FileReference, e achei o assunto bacana para ser compartilhado aqui. Já vi muitos amigos e eu usando soluções tão complexas, sendo que existe uma maneira nativa no Actionscript muito simples de realizar uploads de qualquer tipo de arquivo.

Escrevi um classe muito básica para focar na simplicidade que é este processo, porém você pode implementar mais recursos, como registro de evento externamente via EventDispatcher. Vale lembrar que não adiantar escrever em classe e programar como se fosse uma timeline.

Não há muito a ser falado, o método utilizado é o upload() da classe FileReference, linguagens externas serão usadas unicamente para mover o arquivo para a pasta desejada, ou ainda para a manipulação de dimensões, nomes, etc.

package
{
	import flash.net.*;
	import flash.events.*;
 
	public class upLoad
	{
		private var fr:FileReference = new FileReference();
		private var upUrl:String;
		private var btn:Object;
 
		public function upLoad(obj:Object):void
		{
			this.btn = obj.btn;
			this.upUrl = obj.url;
 
			this.initHandler();
		} 
 
		private function initHandler():void
		{
			this.btn.addEventListener(MouseEvent.CLICK, startUpload);
			this.fr.addEventListener(Event.SELECT, selectHandler);
			this.fr.addEventListener(ProgressEvent.PROGRESS, progressHandler);
			this.fr.addEventListener(Event.COMPLETE, completeHandler);
		} 
 
		private function startUpload(evt:Event):void
		{
			fr.browse([new FileFilter("Imagens", "*.jpg;*.gif;*.png")]);
		}
 
		private function selectHandler(evt:Event):void
		{
			fr.upload(new URLRequest(this.upUrl));
		}
 
		private function progressHandler(evt:ProgressEvent):void
		{
			trace(Math.round(evt.bytesLoaded / evt.bytesTotal) * 100 + "% Enviado")
		}
 
		private function completeHandler(evt:Event):void
		{
			trace("COMPLETE");
		}
	}
}

Para usar a classe segue um exemplo:

var up:upLoad = new upLoad({btn: this.btnBuscar, url: "http://localhost/Examples/upload.php"});

E como foi dito, a participação do PHP não tem nada relacionado como o upload, ele apenas move o arquivo da pasta temporária para a pasta onde se encontra o script PHP.

<?php
 
	move_uploaded_file($_FILES['Filedata']['tmp_name'], "./".$_FILES['Filedata']['name']);
	echo "recebido";
 
?>

14 Responses to “Upload usando apenas FileReference”

  1. Ved Says:

    A questao é: que outra solução para upload tem-se usado no Flex? Pois eu só conheço o FileReference, que aliás, acho uma porcaria, visto que não envia para o backend informações importante sobre o arquivo, como por exemplo seu tipo mime.

    =D

    abração,

    Ved

  2. Rogério Says:

    Estou desenvolvendo um sistema de upload (múltiplo), no PC está rodando muito bem, já no Mac não aparece as informações do ProgressEvent.PROGRESS, fiz um teste com este (tutorial) e também ocorreu o mesmo problema.

    Você sabe o que posso fazer para solucionar este problema?

    Obrigado.

  3. Brouks Says:

    Super atualizado

  4. Marcos Yoshihiro Nakamine Says:

    Parabéns Erick Souza, mais uma vez contribuindo com a evolução dos programadores brasileiros.

  5. Jadson Souza Says:

    Olá Erick, eu gostaria de saber como adaptar esse upload no ASP, fico no aguardo.

  6. Junior Says:

    O titulo é “Upload usando apenas FileReference”, mas vc está usando PHP então faltou “Upload usando apenas FileReference com PHP”, pois não tem como usar apenas o “FileReference “.

  7. Murilo Says:

    Erick,

    Gostaria de saber como efetuar o upload de um arquivo sem que seja necessária a escolha do mesmo através de uma janela. Você acha que posso utilizar o FileReference ?

  8. Vinicius Says:

    @Rogerio estou tendo o mesmo problema que você em servidor windows e acessando de com usuario windows roda belezinha.. mas se o usuario for mac ou linux os dados do progresso nao rola… agora se dor um servidor linux nao adiante nem acessar com um user com windows pq os dados nunca sao mostrados.

    Alguém saberia resover este problema?
    []’s

  9. z4k Says:

    Oi, estou recebendo a seguinte mensagem de erro ao chamar a funcao
    fr.browse([new FileFilter("Documentos (*.doc, *.docx, *.pdf, *.rtf)")]);

    1136: Incorrect number of arguments. Expected 2.

    estranho pois de acordo com a documentacao, pede só 1 argumento.

    public function browse(typeFilter:Array = null)

    http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/net/FileReference.html#browse%28%29

    alguem sabe o que ta havendo ?

  10. Rafael Verger Says:

    @z4k

    De acordo com a documentação afunção recebe um Array e nao um FileFilter, tente passar somente o array de strings que representam as extenções.

  11. Pdf To Word Converter Freeware Says:

    Wow¡­ that was quite comprehensive, thanks.

  12. mmn Says:

    You can definitely see your expertise within the paintings you write. The arena hopes for more passionate writers such as you who aren’t afraid to mention how they believe. At all times follow your heart.

  13. Bruno Says:

    Erick, muito bom o exemplo. parabéns pela iniciativa.

    Eu consigo fazer upload/download em um servidor que exige login com filereference?

  14. up and coming rappers Says:

    up and coming rappers…

    [...]Upload usando apenas FileReference - Erick Souza[...]…

Leave a Reply