Neste artigo veremos como realizar o upload de arquivos com Flex e PHP em suas aplicações Flex.

O processo de envio de arquivos para o servidor web é realizado pelo PHP, mas antes de criarmos nosso código PHP, é necessário preparar o servidor para receber os arquivos, isto é, dar permissões a pastas específicas e tornar uma pasta habilitada a receber o arquivo enviado por upload.

Para dar permissão a uma pasta, clique com o botão direito do mouse no ambiente do servidor e escolha a opção “Permissões de Arquivo”. Na janela que se abrir, digite o código 777 para servidores Apache, isto dará permissões de escrita na pasta escolhida.

Partindo para o script PHP, iremos cria-lo desta maneira:


<?php
	//Filedata é a variável que o flex envia com o arquivo para upload
	$arquivo 	= 	$_FILES['Filedata'];
	// Pasta onde o arquivo vai ser salvo
	$_UP['pasta'] = 'arquivos/';

	// Tamanho máximo do arquivo (em Bytes)
	$_UP['tamanho'] = 1024 * 1024 * 2; // 2Mb

	// Array com as extensões permitidas
	$_UP['extensoes'] = array('pdf','doc','txt', 'jpg');

	// Renomeia o arquivo? (Se true, o arquivo será salvo como .jpg e um nome único)
	$_UP['renomeia'] = false;

	// Array com os tipos de erros de upload do PHP
	$_UP['erros'][0] = 'Não houve erro';
	$_UP['erros'][1] = 'O arquivo no upload é maior do que o limite do PHP';
	$_UP['erros'][2] = 'O arquivo ultrapassa o limite de tamanho especifiado no HTML';
	$_UP['erros'][3] = 'O upload do arquivo foi feito parcialmente';
	$_UP['erros'][4] = 'Não foi feito o upload do arquivo';

	// Verifica se houve algum erro com o upload. Se sim, exibe a mensagem do erro
	if ($_FILES['Filedata']['error'] != 0) {
			die("Não foi possível fazer o upload, erro:<br />" .
 $_UP['erros'][$_FILES['Filedata']['error']]);
			exit; // Para a execução do script
	}

	// Caso script chegue a este ponto, não houve erro com o processo de  upload
 e o PHP pode continuar

	// Faz a verificação da extensão do arquivo
	//$extensao = strtolower(end(explode('.', $_FILES['arquivo']['name'])));
	$arquivo = $_FILES['Filedata']['name'];
	$extensao  = substr($arquivo,-3);
	if (array_search($extensao, $_UP['extensoes']) === false) {
			echo "Por favor, envie arquivos com as seguintes extensões: doc, 
pdf, txt ou jpg";
	}

	// Faz a verificação do tamanho do arquivo enviado
	else if ($_UP['tamanho'] < $_FILES['Filedata']['size']) {
		echo "O arquivo enviado é muito grande, envie arquivos de até 2Mb.";
	}

	// O arquivo passou em todas as verificações, hora de tentar movê-lo para a pasta
	else {
			// Primeiro verifica se deve trocar o nome do arquivo
			if ($_UP['renomeia'] == true) {
			// Cria um nome baseado no UNIX TIMESTAMP atual e com
 extensão .jpg
			$nome_final = date('d-m-Y').'_'.".$extensao";
	} else {
			// Mantém o nome original do arquivo
			$nome_final = $_FILES['Filedata']['name'];
	}

	// Depois verifica se é possível mover o arquivo para a pasta escolhida
	if (move_uploaded_file($_FILES['Filedata']['tmp_name'], $_UP['pasta'] . $nome_final)) {
	// Upload efetuado com sucesso, exibe uma mensagem e um link para o arquivo
	echo "Seu arquivo  foi inserido com sucesso!";
	//echo '<br /><a href="' . $_UP['pasta'] . $nome_final . '">
Clique aqui para acessar o arquivo</a>';
	} else {
			// Não foi possível fazer o upload.Algum problema com a pasta
			echo utf8_encode('Não foi possível enviar este arquivo, tente novamente');
			}

		}
?>
Listagem 1. Arquivo PHP responsável pelo upload

Salvamos nosso arquivo, que neste caso foi nomeado de upload.php.

Agora iremos construir um formulário HTML apenas para testar nosso script e checar se está funcionando:


<html>
<head></head>
<body>
	<form method="post" enctype="multipart/form-data" action="upload.php">
		<input type="file" name="Filedata">
		<input type="submit">
	</form>
</body>
</html>
Listagem 2. Arquivo HTML para testar o upload

Após testar o arquivo PHP com o formulário HTML e obtermos a mensagem de sucesso, seguimos para a parte do Flex.


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
layout="absolute">
	<mx:TextArea id="status_txt" width="429" height="94" 
	x="144" y="62" editable="false"/>
	<mx:Button x="44" y="32" click="selectFile();" 
	label="Selecione..."/>
	<mx:TextInput x="144" y="32" id="file_txt" 
	width="429"/>
	<mx:Label x="44" y="10" text="Anexar arquivo:"/>
	<mx:Label x="44" y="63" text="Status do Envio:" 
	fontWeight="bold" fontStyle="italic"/>
	
	<mx:Script>
		<![CDATA[		
			import mx.rpc.events.ResultEvent;
			import mx.controls.Alert;
			public var file:FileReference;
	
	public function selectFile():void 
	{
		file = new FileReference();
		
		file.addEventListener(Event.SELECT, fileSelected);
		file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, 
		uploadDataComplete);
		file.addEventListener(Event.COMPLETE, uploadComplete);
		file.addEventListener(IOErrorEvent.IO_ERROR, handleError);
		file.browse();
	}
	
	public function handleError(event:IOErrorEvent):void 
	{
		status_txt.text = 'ERROR: ' + event.text + '\n';
	}
	public function fileSelected(event:Event):void
	{
		file = FileReference(event.target);
		file_txt.text = file.name;
		status_txt.text = 'upload file: '+ file.name  + '\n';
		
		var request:URLRequest = new URLRequest();
    	request.url = "http://localhost/upload.php";
    	file.upload(request);			
	}
		
	public function uploadDataComplete(event:DataEvent):void 
	{
		var result:XML = new XML(event.data);
		
		status_txt.text += 'RESULTADO: ' + result.toString()  + '\n';
		
	}
	
	public function uploadComplete(event:Event):void 
	{
		status_txt.text += 'Upload Realizado\n';

	}
		]]>
	</mx:Script>
	
</mx:Application>
Listagem 3. Arquivo Flex para realizar upload

No Flex foi criado um projeto chamado Up, onde nas primeiras linhas incluímos a classe de eventos e a classe responsável por alertas.

A variável do tipo filereference receberá o arquivo selecionado na máquina do usuário, seu tipo será FileReference (public var file:FileReference;) para ser utilizada no método de selecionar arquivo. No selectFile acessamos a propriedade addEventListener da variável file para escutar cada etapa do processo de upload e emitir uma mensagem correspondente.

Os eventos de erro no processo são capturados pelo método handleError.

Quando o arquivo for selecionado, o método fileselected irá enviar para a URL atribuída na variável request.

O método uploadDataComplete exibe o resultado do envio e o método uploadComplete é disparado após o evento de upload ser concluído.

Após a execução, visualizamos a aplicação funcionado, consumindo o arquivo PHP e exibindo o status do processo de upload.