Boa noite pessoal!
Recentemente estava desenvolvendo uma galeria de imagens e me deparei com um problema: Como possiblitar que o usuário selecione vários arquivos de uma só vez? Como não gostaria de simplesmente inserir vários campos “file” (o que faria o usuário selecionar 1 por 1), eu poderia comprar um Applet Java ou procurar por componentes prontos. Mas como as últimas versões do Flash possibilitam a seleção múltipla de arquivos, decidi pesquisar sobre isso e criar minha própria sistemática alá álbum de fotos do Orkut.
1. Para iniciar, crie um novo Documento Flash e adicione o texto “Adicionar”, pois a partir do Flash Player 10 a função de seleção de arquivos só pode ser chamada de dentro do swf, por segurança.
2. Acesse o painel de Actions e adicione o seguinte código:
// Objeto que possibilita seleção múltipla dos arquivos var fileRefList:FileReferenceList = new FileReferenceList(); // Guarda o "id" arquivo que está sendo enviado no momento var atual:Number = 0; // Array dos arquivos selecionados var selecionados:Array; // Evento CLICK no stage para seleção dos arquivos stage.addEventListener(MouseEvent.CLICK, clique); // Abre janela de seleção dos arquivos function clique(e:MouseEvent):void { fileRefList.browse(); }
Este código já é suficiente para fazer o flash exibir a janela para seleção múltipla de arquivos. O próximo passo agora será o envio dos arquivos, um log básico para que usa o Firebug e notificar a página quando um arquivo é enviado.
// Evento ao selecionar os arquivos e clicar em "Abrir" fileRefList.addEventListener(Event.SELECT, selectHandler); function selectHandler(e:Event):void { // Retorna os arquivos selecionados var arqs:FileReferenceList = FileReferenceList(e.target); // Seta a array com os arquivos selecionados selecionados = arqs.fileList; // Envia o primeiro arquivo da array enviar(0); } function enviar(i:Number):void { // URL do script php para o upload var url:URLRequest = new URLRequest("http://localhost/upload.php"); // Arquivo a ser enviado var arq:FileReference = FileReference(selecionados[i]); // Evento que dispara quando o Flash recebe um retorno do script php arq.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, completeHandler); // Evento que dispara quando ocorre um erro de entrada/saída arq.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); try { // Envia o arquivo arq.upload(url); } catch (erro:Error) { log("Ocorreu um erro ao enviar o arquivo "+arq.name); } } // Executa ao completar o envio e receber um retorno do script php function completeHandler(e:DataEvent):void { // Seta a variavel com a referencia do arquivo enviado var arq:FileReference = FileReference(e.target); // Executa a função javascript "enviado" da página e envia o nome do arquivo ExternalInterface.call("enviado", arq.name); log(arq.name+" enviado."); // Remove os eventos arq.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, completeHandler); arq.removeEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); // Incrementa o indice para enviar o próximo arquivo atual++; // Verifica se todos os arquivos foram enviados if (atual < selecionados.length) enviar(atual); else log("Todos os arquivos foram enviados."); } function ioErrorHandler(e:IOErrorEvent):void { // Seta a variável com o arquivo da tentativa de envio var arq:FileReference = FileReference(e.target); log("Ocorreu um erro de entrada/saída no arquivo " + arq.name); } // Loga mensagens com trace e console.log (Firebug) function log(msg:String):void { trace(msg); ExternalInterface.call("console.log", msg); }
Obs.: Não esqueça de alterar a URL do seu script de upload.
O código PHP pode ser bem simples, como o seguinte:
// Por padrão, o Flash envia o arquivo como 'Filedata' $file = $_FILES['Filedata']; // Onde salvar o arquivo $arquivo = "uploads/".$file['name']; // Move o arquivo e retorna o resultado para o Flash com o "echo" echo move_uploaded_file($file['tmp_name'], $arquivo);
É importante lembrar que dependendo do seu servidor será necessário permissão de escrita no diretório “uploads”.
E por fim você deve fazer uma página com o swf, uma div com id=”arquivos” e a função Javascript “enviado()” para receber o nome do arquivo que foi enviado com sucesso ao servidor. Abaixo o código Javascript que coloquei na tag head da página:
// O Flash executa esta função quando o arquivo termina de ser enviado function enviado(nome) { // Insere a mensagem na div #arquivos document.getElementById("arquivos").innerHTML += '<div>'+nome+' enviado.</div>'; }
Código HTML (body):
<object width="100" height="30" type="application/x-shockwave-flash" id="uploader" name="uploader" data="upload.swf"> <param name="menu" value="false"/> <param name="allowScriptAccess" value="always"/> </object> <div id="arquivos"></div>
Faça o download dos arquivos:
|
|
download: upload.rar (8.54KB) added: 30/04/2009 clicks: 647 description: Arquivos utilizados neste post. |
Em breve vou postar uma versão bastante melhorada, integrando jQuery e barra de progresso.
Um abraço e até a próxima!

Mano cê tá de parabéns!
Instalei o script no meu site pra testar contudo verifiquei que a progress bar está muito veloz em relação ao upload, ou seja, ela indica 100% enquanto o upload mal começou.
Tem como corrigir isso?
Um abraço.
23/07/2009 @ 3:51 am
Muito bom velho, so que tenho uma pergunta pra ti fezer… te como altera o nome do arquivo quando for salva no servidor.
do tipo….
Upload de IMAGEN.BMP
quero mandar pro PHP ja com o nome de 1234IMAGEN.BMP
tipo to tentando altera direto pelo file reference mas ele não muda o valor .name do objeto. se possivel da uma força ai ^^vlw.
14/11/2009 @ 9:25 am
estou montando um portal, e preciso redimencionar a imagens, tenho uma class que faz isso, além de renomear por um nome e armazenar em um banco de dados…
uso esse código
“upload executado com sucesso!”,
“1″ => “O arquivo é maior que o permitido pelo Servidor”,
“2″ => “O arquivo é maior que o permitido pelo formulario”,
“3″ => “O upload do arquivo foi feito parcialmente”,
“4″ => “Não foi feito o upload do arquivo”
);
function Verifica_Upload(){
$this->arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;
if(!is_uploaded_file($this->arquivo['tmp_name'])) {
return false;
}
$get = getimagesize($this->arquivo['tmp_name']);
if($get["mime"] != “image/jpeg”){
echo ‘Esse foto nao é uma imagem valida’;
exit;
}
return true;
}
function Envia_Arquivo(){
if($this->Verifica_Upload()) {
$this->gera_fotos();
return true;
} else {
echo ”.$this->erro[$this->arquivo['error']].”;
}
}
function gera_fotos() {
$pasta_album = $_POST['nome_album'];
$diretorio = “fotos/”;
$diretorio_album = “fotos/$pasta_album/”;
$diretorio_g_album = “fotos/$pasta_album/normal/”;
$diretorio_p_album = “fotos/$pasta_album/thumb/”;
if(!file_exists($diretorio)) {
mkdir($diretorio);
chmod($diretorio, 0777);
}
if(!file_exists($diretorio_album)) {
mkdir($diretorio_album);
chmod($diretorio_album, 0777);
}
if(!file_exists($diretorio_g_album)) {
mkdir($diretorio_g_album);
chmod($diretorio_g_album, 0777);
}
if(!file_exists($diretorio_p_album)) {
mkdir($diretorio_p_album);
chmod($diretorio_p_album, 0777);
}
$get2 = getimagesize($this->arquivo['tmp_name']); /* Vai servir para verificar se eh GIF ou JPG ou PNG*/
$aux_tipo_imagem = $get2["mime"]; /* Vai servir para verificar se eh GIF ou JPG ou PNG*/
if ($aux_tipo_imagem == “image/jpeg”) {
$nome_foto = “imagem_”.time().”.jpg”;
$nome_thumb = “thumb_”.time().”.jpg”;
//determino uma resolução maxima e se a imagem for maior ela sera reduzida
reduz_imagem_jpg($this->arquivo['tmp_name'], 501, 501, $diretorio_g_album.$nome_foto);
//passo o tamanho da thumbnail
reduz_imagem_jpg($this->arquivo['tmp_name'], 191, 291, $diretorio_p_album.$nome_thumb);
}
if ($aux_tipo_imagem == “image/gif”) {
$nome_foto = “imagem_”.time().”.gif”;
$nome_thumb = “thumb_”.time().”.gif”;
//determino uma resolução maxima e se a imagem for maior ela sera reduzida
reduz_imagem_gif($this->arquivo['tmp_name'], 501, 501, $diretorio_g_album.$nome_foto);
//passo o tamanho da thumbnail
reduz_imagem_gif($this->arquivo['tmp_name'], 191, 291, $diretorio_p_album.$nome_thumb);
}
if ($aux_tipo_imagem == “image/png”) {
$nome_foto = “imagem_”.time().”.png”;
$nome_thumb = “thumb_”.time().”.png”;
//determino uma resolução maxima e se a imagem for maior ela sera reduzida
reduz_imagem_png($this->arquivo['tmp_name'], 501, 501, $diretorio_g_album.$nome_foto);
//passo o tamanho da thumbnail
reduz_imagem_png($this->arquivo['tmp_name'], 191, 291, $diretorio_p_album.$nome_thumb);
}
echo ”.$this->erro[$this->arquivo['error']].”;
// -Banco de Dados – //
include “funcoes/conectar_db.php”;
mysql_select_db($db);
$id_album = $_POST['nome_album'];
$sql=mysql_query(“select * from $tabela_albuns order by id_album asc”) or die(mysql_error());
$total = mysql_num_rows($sql);
if ($total>0){
for($i=1;$i0){
for($i=1;$i<=$total;$i++){
$dados = mysql_fetch_array($sql);
$album_id = $dados["id_album"];
$capa_album = $dados["capa"];
if($album_id == $id_album){
if ($capa_album == 1){
$capa = 0;
$i = $total;
}
}
}
}
$texto_foto = $_POST['descricao'];
$sql = "insert INTO fotos Values ('','$id_album','$album','$data','$id_categoria','$categoria','$nome_thumb','$nome_foto','$texto_foto','$capa')";
$query = mysql_query($sql);
mysql_close($conexao);
}
}
e dentro da função,
$original_y) {
$porcentagem = (80 * $max_x) / $original_x;
} else {
$porcentagem = (80 * $max_y) / $original_y;
}
$tamanho_x = $original_x * ($porcentagem / 80);
$tamanho_y = $original_y * ($porcentagem / 80);
$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
$image = imagecreatefromjpeg($img);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);
return imagejpeg($image_p, $nome_foto, 80);
}
//######################## Função para imagem GIF ###########################
function reduz_imagem_gif($img, $max_x, $max_y, $nome_foto) {
//pega o tamanho da imagem ($original_x, $original_y)
list($width, $height) = getimagesize($img);
$original_x = $width;
$original_y = $height;
// se a largura for maior que altura
if($original_x > $original_y) {
$porcentagem = (80 * $max_x) / $original_x;
} else {
$porcentagem = (80 * $max_y) / $original_y;
}
$tamanho_x = $original_x * ($porcentagem / 80);
$tamanho_y = $original_y * ($porcentagem / 80);
$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
$image = imagecreatefromgif($img);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);
return imagegif($image_p, $nome_foto, 80);
}
//######################## Função para imagem PNG ###########################
function reduz_imagem_png($img, $max_x, $max_y, $nome_foto) {
//pega o tamanho da imagem ($original_x, $original_y)
list($width, $height) = getimagesize($img);
$original_x = $width;
$original_y = $height;
// se a largura for maior que altura
if($original_x > $original_y) {
$porcentagem = (80 * $max_x) / $original_x;
} else {
$porcentagem = (80 * $max_y) / $original_y;
}
$tamanho_x = $original_x * ($porcentagem / 80);
$tamanho_y = $original_y * ($porcentagem / 80);
$image_p = imagecreatetruecolor($tamanho_x, $tamanho_y);
$image = imagecreatefrompng($img);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $tamanho_x, $tamanho_y, $width, $height);
return imagepng($image_p, $nome_foto, 80);
}
24/11/2009 @ 12:00 am
Parabéns pelo tutorial!
Me ajudou muito.
Fiz apenas uma modificação
Criei a variável “atual” normalmente, porém sem o valor 0 e na função “clique”, declarei “atual = 0″.
Precisei da modificação pois depois de enviar a primeira vez, ele não enviava novamente a lista de arquivos, enviava apenas o primeiro arquivo e finalizava.
Mais uma vez parabéns pelo post!
Abraços
01/02/2011 @ 11:44 am