SWFUpload e jQuery

Este post está depreciado, favor ler o post:

jqswfupload – jQuery e swfupload em uma única linha

Desculpe a demora para voltar a escrever, estava atolado de projeto e como prometi, estava desenvolvendo um script para o jQuery em conjunto com a biblioteca SWFUpload. Bem, para quem não sabe sobre o que estou falando, há posts que contam como tudo começou:

Descobri o SWFUpload que é uma biblioteca bastante completa e que faz todo o background do processo. Então você tem vários parâmetros e callbacks que podem ser usados da maneira que preferir. Como já sou acostumado com o jQuery, resolvi usá-lo para fazer a parte do callback, ou seja, toda a interface que o usuário experimenta.

Devido as limitações do Javascript, da própria maneira de como é feito o upload de arquivos, temos que reconhecer que este sistema de uploads é uma revolução. Exagero? Como vocês faziam sistemas de uploads de arquivos antes? De cinco em cinco? usando iframe? Enviando os arquivos via FTP? E quando se trata de um sistema que será usado para um cliente?

Apesar de exisitir alguns plugins para o jQuery que tem esse objetivo, confesso que a maioria deles não tem a versatilidade e o poder oferecido pelo fancy upload, desenvolvido para o mootools. Os plugins que mais se aproximam para o jQuery são o Multiple File Upload, que é bom, mas não é versátil e o que ele faz é inserir campos de arquivo escondido e deixar para o usuário somente o registro do arquivo que foi escolhido. No lado do PHP estes campos serão tratados como arrays, bom, mas nada versátil e possui todas as limitações já existentes, uma delas é que você não sabe o tamanho do arquivo até ele ser jogado temporariamente no servidor. O outro é o jqUploader, que é desenvolvido em Flash, sendo assim, o jQuery faz a inserção on the fly do swf, mas a interface e o processamento é todo em flash. O SWFUpload triunfa por que ele usa o flash, mas você não sabe que está sendo usado. Pelo fato do Action Script possuírem classes que manipula arquivos de uma maneira bem mais versátil que o Javascript, além da classe external interface, que deixa o flash interagir com o html externo, esta biblioteca usa essas ferramentas para devolver ao desenvolvedor as respostas para serem usadas adequadamente.

Ao script

O SWFUpload oferece diversos callbacks para serem usados, ele pode ser manipulado por javascript. Usei o jQuery em conjunto com o plugin interface para oferecer uma experiência rica para o usuário fazer o upload de arquivos, como no Flickr.

Havia prometido um plugin, mas com um script ele poderá ser explicado e assim personalizado da maneira que acharem melhor.

Exemplo da interação do SWFUpload com o jQuery

A tarefa do SWFUpload

O trabalho do SWFUpload, como falado anteriormente é processar todos os dados utilizando o action script e devolver estes dados em tempo real para o ser manipulado via javascript.

Portanto, os scripts que precisam ser inseridos no cabeçalho são:

  • SWFUpload.js – o script em si, retirado do site, aqui ele está compactado, mas no site tem ele completo e a versão mais atual
  • SWFUpload.swf – O arquivo flash que faz o processamento, aconselho colocar no mesmo local do script acima, mas isto pode ser customizado.
  • init.js – O script que cria o objeto da classe, com as configurações e a referência aos callbacks necessários
  • callback.js – É onde eu entro utilizando o jQuery para facilitar a sua vida :-) .

O arquivo que precisa de explicação pela parte do SWFUpload é o init.js que instancia o objeto e o inicializa. Ele permite várias configurações. Todas elas estão na sua documentação. Vou tentar descrever o que usei para fazer este script:

var swfu;

var init_uploader = function()

{

swfu = new SWFUpload({upload_script : '../upload.php',

target : "container_arquivo",

flash_path : 'swfupload/SWFUpload.swf',

allowed_filesize : 30720, // 30 MB

allowed_filetypes : "*.*",

allowed_filetypes_description : "todos arquivos...",

browse_link_innerhtml : "Procurar",

upload_link_innerhtml : "Enviar arquivos",

upload_file_start_callback : "inicioUpload",

browse_link_class : "btn_procurar",

upload_link_class : "btn_upload",

upload_file_cancel_callback : 'cancelado',

upload_file_queued_callback : "entrouFila",

upload_progress_callback : "progresso",

upload_file_complete_callback : 'terminoArquivo',

upload_queue_complete_callback : "fimDownload",

upload_error_callback : 'uploadError'	});

swfu.loadUI();

};

//please use better handler attachment than this:

window.onload = init_uploader;

Acho que não precisa de muitas explicações, por que as funções já falam por si. Eu especifiquei as funções que serão usadas no callback.js para manipular as respostas, como por exemplo, quando seleciona um arquivo, quando inicia um download e a barra de progresso, todas elas aceitam alguns parâmetros, entre eles o objeto file, que tem várias propriedades, como o id que é uma identificação única do arquivo e graças a ele temos total controle do que está sendo feito com o arquivo. O arquivo upload.php é o script de servidor que faz a manipulação e copia para o local desejado, ele pode ser acessado via $_FILE['Filedata']. A diferença desse para os plugins do jQuery que faz a manipulação dos uploads, é que não será manipulado por um array de arquivos, mas sim será chamado o upload.php para cada arquivo, ou seja, será enviado um por um da fila e seu controle será feito em tempo real, assim como a resposta para o usuário.

Este script é mais geral, você pode especificar os tipos de arquivos desejados. O bom nisto é que a caixa de diálogo exibida pelo flash você acessa o sistema de arquivos do cliente, mas só exibe os arquivos do formato especificado.

É hora do callback!

O arquivo callback.js possui toda a manipulação necessária e a inserção on the fly da lista de arquivos, nome, tamanho, botão de remover, barra de progresso etc. Tudo é feito via jQuery e com os efeitos do plugin interface.

Dê uma analisada no html, pois alguns elementos são essenciais para o funcionamento, pois através dele o jQuery faz inserções de conteúdo on the fly.

O arquivo css encontra-se abaixo e pode ser personalizado:

/* Upload de arquivos */

body {font-family: Arial, Helvetica, sans-serif;

font-size: 12px;

}

#wrapper {

width: 600px;

margin: 20px auto;

border: 1px solid gray;

background-color: #FFFBEF;

}

#wrapper h2 {

text-align: center;

background-color: #3E458F;

width: 100%;

color: white;

padding: 12px 0;

}

#contentContainer {

width: 300px;

height: auto;

margin: 10px auto;

background-color: #FDFFEF;

border: 1px solid #9F8181;

padding: 20px;

}

#container_arquivo {

padding: 10px 6px;

margin: 8px auto;

}

#lista li {

width: 90%;

height: 75px;

margin: 12px 0;

padding: 6px;

background-color: #DBDFC3;

list-style-type: none;

}

#lista li a {

display: block;

}

.msg_fim_upload {

text-align: center;

color: red;

font-weight: bold;

padding: 5px;

background-color: #FFE7DF;

}

.btn_procurar, .btn_upload {

padding: 4px;

background-color: #E0E3EF;

border: 1px solid #74798F;

margin: 10px;

text-decoration: none;

}

.btn_procurar:hover, .btn_upload:hover {

background-color: #DFDFDF;

}

.arquivo {

font-weight: bold;

color: #6F3039;

}

.campo_peq {

border: 1px solid gray;

font-size: 10px;

background-color: #E5EFE0;

margin: 6px 5px 0 5px;

}

.barra {

background-color: green;

color: white;

width: 1px;

margin: 4px 0;

border: 1px solid gray;

text-align: center;

display: block;

}

/* fim do upload de arquivos */

Alguns dessas estilizações são para a demonstração online e outros são para o funcionamento adequado do script.

O script foi testado no Firefox 1.2.xx, no IE6 e IE7. Nestes dois últimos, há uma pequena falha na animação, mas devido ao interface. Se não gostou do resultado do efeito, ele pode ser alterado pelo callback nas linhas que tem os métodos Grow(crescer) e Shrink(encolher).

Espero que tenham gostado e que façam bom proveito deste script e qualquer dúvida, estou a disposição.

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>